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);
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]+"
où 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
\040
correspond exactement au caractère espace.
Expression rationnelle PHP référence
Nouveau lien
séquences d'échappement pour Regex PHP
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 horizontauxx
Ignorer les espacesEn Perl, le commutateur est \s
(espace).
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.
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.
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);
Utilisez-le comme ceci pour permettre l'espace unique.
$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
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.