web-dev-qa-db-fra.com

Faire correspondre un espace dans regex

Je dois faire correspondre un caractère d'espacement dans une expression régulière PHP. Quelqu'un a une idée?

Je veux dire comme "gavin schulz", l'espace entre les deux mots. J'utilise une expression régulière pour m'assurer que je n'autorise que les lettres, les chiffres et les espaces. Mais je ne sais pas comment trouver cet espace. C'est ce que j'ai en ce moment:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
207
Gavin Schulz

Si vous recherchez un espace, ce serait " " (un espace).

Si vous cherchez un ou plusieurs, c’est " *" (c’est deux espaces et un astérisque) ou " +" (un espace et un plus).

Si vous recherchez un espacement commun, utilisez "[ X]" ou "[ X][ X]*" ou "[ X]+"X est le caractère de tabulation physique (et chaque caractère est précédé d'un seul espace). exemples).

Ceux-ci fonctionneront dans tous les moteurs de regex * que j'ai vus (dont certains n'ont même pas le ou plus "+" caractère, pouah).

Si vous savez que vous utiliserez l'un des moteurs de regex les plus modernes, "\s" et ses variantes sont la voie à suivre. De plus, je pense que les limites des mots correspondent également au début et à la fin des lignes, ce qui est important lorsque vous recherchez des mots pouvant apparaître sans espaces précédents ou suivants.

Pour PHP spécifiquement, cette page peut vous aider.

De votre édition, il semble que vous souhaitiez supprimer tous les caractères non valides. Le début de ceci est (notez l'espace dans la regex):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

Si vous voulez aussi que la supercherie veille à ce qu'il n'y ait qu'un espace entre chaque mot et aucun au début ou à la fin, c'est un peu plus compliqué (et probablement une autre question), mais l'idée de base serait la suivante:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end
333
paxdiablo

\040 correspond exactement au caractère espace.

Expression rationnelle PHP référence

Nouveau lien
séquences d'échappement pour Regex PHP

43
davethegr8

Voici tout ce que vous devez savoir sur les espaces dans les expressions régulières:

  • [[:blank:]] Espace ou tabulation uniquement
  • [[:space:]] Espace blanc
  • \s N'importe quel caractère blanc
  • \v Espace blanc vertical
  • \h Blancs horizontaux
  • x Ignorer les espaces
22
Fletcher Ripp

En Perl, le commutateur est \s (espace).

6
Elsporko

Il me semble que l’utilisation d’un REGEX dans ce cas serait exagérée. Pourquoi pas juste strpos pour trouver le caractère d'espace. De plus, il n'y a rien de spécial à propos du caractère d'espace dans les expressions régulières, vous devriez pouvoir le rechercher de la même façon que vous le feriez pour tout autre caractère. Autrement dit, à moins que vous ne désactiviez les espaces de motif, ce qui ne serait guère nécessaire dans ce cas.

5
Kibbee

J'utilise une regex pour m'assurer que je n'autorise que les lettres, les chiffres et un espace

Il suffit ensuite d'ajouter un espace à ce que vous avez déjà:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(note, j'ai enlevé le s| qui semblait non intentionnel? Certes, le s était redondant; vous pouvez restaurer le | si vous en avez besoin)

Si vous voulez spécifiquement * un * espace, comme dans niquement un seul, vous aurez besoin d'une expression plus complexe que celle-ci, et vous voudrez peut-être envisager une logique distincte, non regex.

4
Peter Boughton

Vous pouvez également utiliser le\b pour une limite de Word. Pour le nom, je voudrais utiliser quelque chose comme ça:

[^\b]+\b[^\b]+(\b|$)

EDIT Modifier ceci pour qu'il s'agisse d'un regex dans l'exemple Perl

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

EDIT AGAIN En fonction de ce que vous voulez:

$new_tag = preg_replace("/[\s\t]/","",$tag);
3
Suroot

Utilisez-le comme ceci pour permettre l'espace unique.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
1
Ajay Singh

J'essaie [[: space:]] dans un cas où les blogueurs de WordPress utilisent des caractères d'espace non standard. On dirait que ça va marcher.

1
Jeremy Schultz