Opérateur logique ET avec php expression régulière
Je voudrais utiliser une sorte d'opérateur logique "ET" dans mon expression régulière.
J'ai essayé ceci:
(?=exp1)(?=exp2)
Mais en PHP ?=
ne fonctionne pas et le besoin d'écrire mon programme en langage PHP. Est-il une autre méthode? L'expression doit correspondre si il sont présents à toutes les conditions et dans n'importe quel ordre.
Je ne veux pas écrire chaque permutation comme:
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
Je pense que vous aurez besoin de diviser les regexes
Ummm. php supporte
Ummm. php supporte
(?=...)
: php.net/manual/en/regexp.reference.assertions.phpOriginalL'auteur Belsen | 2011-11-22
Vous devez vous connecter pour publier un commentaire.
PHP prend en charge la prospection des expressions. Vous n'êtes probablement pas les utiliser correctement.
En supposant que vous voulez faire correspondre une chaîne qui contient tous les trois de
foo
,bar
etbaz
, vous avez besoin de la regexCe sera le retour d'un match pour les chaînes
foobarbaz
oubarbazfoo
etc. Cependant, ce match sera une chaîne vide (parce que le lookaheads ne consommez pas de caractères). Si vous voulez que la regex pour revenir à la chaîne elle-même, l'utilisationqui va alors correspondre à l'ensemble de la chaîne si elle remplit les trois critères.
Je voudrais simplement utiliser
Prendre note que cela correspond également à une chaîne comme
foonly bartender bazooka
. Si vous ne voulez pas que (en autorisant uniquement pur des permutations d'un pour chacune des trois expressions), vous pouvez le faire avec un peu d'astuce:correspond
foobarbaz
,foobazbar
,barfoobaz
,barbazfoo
,bazfoobar
etbazbarfoo
(et rien d'autre). Le "truc" est inspiré par Jan Goyvaerts' et Steven Levithan excellent ouvrage "Expressions Régulières"Livres De Cuisine (p. 304). Il fonctionne comme suit:foo
etc.) est suivi par un vide capture d'un groupe()
qui correspond toujours à si la partie requise a été appariés.foobarbar
, la partie(?:foo()|bar()|baz()){3}
avez obtenu, mais\3
échoue, alors l'ensemble de la regex échoue.\1\2\3
réussit à correspondant à la fin de la chaîne, car chacun des groupes capturés ne contient rien, mais la chaîne vide.pourriez-vous fournir des ressources supplémentaires à ce sujet? Je n'ai jamais vu quelque chose comme foo ()|(barre)|baz() avant.
Je suppose que, ce que je veux poser est de savoir quelle est l'importance des parenthèses vides?
J'ai ajouté une explication et de référence.
merci!!!! bonne réponse
OriginalL'auteur Tim Pietzcker
En plus de @Tim réponse:
Ce ne peut être vrai. Vous dites en anglais simple : assurez-vous que le texte est ici exp1 et aussi assurez-vous que le texte est ici exp2. Pas moyen, c'est vrai. Il ne sera jamais de match.
OriginalL'auteur FailedDev