313 votes

Correspondance d'un espace dans une expression rationnelle

Comment faire correspondre un caractère espace dans une expression régulière PHP ?

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 l'espace. Voici ce que j'ai pour l'instant :

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

2 votes

Hmm... il n'y a pas non plus de question sur la correspondance entre un 'a' et un 'b'... ;)

1 votes

Vous devriez voir le exemples de regex

464voto

paxdiablo Points 341644

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

Si vous en cherchez un ou plusieurs, il s'agit de " *" (c'est deux espaces et un astérisque) ou " +" (un espace et un plus).

Si vous cherchez un espacement commun, utilisez "[ X]" o "[ X][ X]*" o "[ X]+"X est le caractère de tabulation physique (et chacun est précédé d'un espace unique dans tous ces exemples).

Ceux-ci fonctionneront dans chaque * Je n'ai jamais vu de moteur de regex (dont certains n'ont même pas la fonction "un ou plus"). "+" personnage, ugh).

Si vous savez que vous allez utiliser l'un des moteurs regex les plus modernes, "\s" et ses variantes sont la voie à suivre. En outre, 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 qui peuvent apparaître sans espace avant ou après.

Pour PHP spécifiquement, cette page peut aider.

D'après votre édition, il semble que vous vouliez supprimer tous les caractères non valides. Le début de ceci est (notez l'espace à l'intérieur de la regex) :

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

Si vous voulez également vous assurer qu'il n'y a qu'un seul 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

0 votes

Son expression rationnelle d'origine semblait vouloir remplacer le caractère " ". Vous niez l'espace, donc son espace ne sera pas "supprimé" comme prévu.

1 votes

Je cite : "ne permettent que les lettres, les chiffres et les espaces", le RE initial de Gavin était erroné (c'est pourquoi il posait la question). Mon RE supprime tout ce qui n'est pas un de ces éléments.

0 votes

Pourquoi l'espace doit-il se trouver à la fin du motif de correspondance plutôt que, disons, au milieu ?

58voto

davethegr8 Points 5717

Pour correspondre exactement au caractère espace, vous pouvez utiliser la valeur octale \040 ( Caractères Unicode affichés en octal ) ou la valeur hexadécimale \x20 ( Caractères Unicode affichés en hexadécimal ).

Voici la référence de la syntaxe regex : https://www.regular-expressions.info/nonprint.html .

8voto

Elsporko Points 82

En Perl, le commutateur est \s (espaces blancs).

28 votes

C'est incorrect - il rassemble tous les espaces blancs, pas seulement le caractère espace.

0 votes

Mais la question porte sur PHP, et non sur Perl.

1 votes

@PeterMortensen Perl et PHP utilisent le même moteur de regex PCRE, donc cela fonctionnera en PHP.

4voto

Kibbee Points 36474

Il me semble que l'utilisation d'un REGEX dans ce cas serait tout simplement exagérée. Pourquoi ne pas simplement strpos pour trouver le caractère espace. De plus, le caractère espace n'a rien de spécial dans les expressions régulières, vous devriez pouvoir le rechercher de la même manière que n'importe quel autre caractère. C'est-à-dire, à moins que vous n'ayez désactivé les espaces blancs des motifs, ce qui ne serait guère nécessaire dans ce cas.

3voto

Suroot Points 3079

Vous pouvez également utiliser le \b pour une limite de mot. Pour le nom, j'utiliserais quelque chose comme ceci :

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

EDIT Modifier ceci pour être une regex en Perl exemple

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

EDIT ENCORE En fonction de ce que vous voulez :

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

0 votes

Le correcteur de frontières de mots \b correspond également aux traits d'union

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X