PHP supporte les expressions lookahead. Cependant, vous ne les utilisez probablement pas correctement.
En supposant que vous voulez faire correspondre une chaîne qui contient les trois foo
, bar
et baz
, vous avez besoin du regex
^(?=.*foo)(?=.*bar)(?=.*baz)
Cela renverra un match pour les cordes foobarbaz
ou barbazfoo
etc. Cependant, ce match sera la chaîne vide (parce que les lookaheads ne consomment aucun caractère). Si vous voulez que le regex pour retourner la chaîne elle-même, utilisez
^(?=.*foo)(?=.*bar)(?=.*baz).*
qui sera ensuite correspondre à la chaîne entière si elle remplit les trois critères.
Je voudrais simplement utiliser
if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) {
# Successful match
} else {
# Match attempt failed
}
Prenez note que cela correspond aussi une chaîne comme foonly bartender bazooka
. Si vous ne voulez pas que (ne permettant permutations pures d'un chacun des trois expressions), vous pouvez le faire avec un petit truc:
^(?:foo()|bar()|baz()){3}\1\2\3$
matchs foobarbaz
, foobazbar
, barfoobaz
, barbazfoo
, bazfoobar
et bazbarfoo
(et rien d'autre). Le «truc» est inspiré par l'excellent livre de Jan Goyvaerts et Steven Levithan, "Regular Expressions Cookbook" (p. Il fonctionne comme suit:
- Chaque pièce détachée (
foo
etc.) est suivi par un groupe de capture vide ()
qui correspond toujours si la partie requise a été adaptée.
- Ainsi, si les trois parties requises ont été reconnues, les trois groupes de capture vides ont été appariés.
- Les références arrières suivantes ne réussissent que si chacun des groupes de capture a participé à la correspondance.
- Si la chaîne est
foobarbar
, la partie (?:foo()|bar()|baz()){3}
aura correspondu, mais \3
échoue, de sorte que la regex globale échoue.
- Si, cependant, tous les trois ont participé à la correspondance,
\1\2\3
parvient à correspondre à la fin de la chaîne car chacun des groupes de capture ne contient que la chaîne vide.
Je pense que vous aurez besoin de diviser les expressions rationnelles – DiogoDoreto
Ummm. php prend en charge '(? = ...)': http://php.net/manual/en/regexp.reference.assertions.php –