On sait pas ce que tu soumets à tes regex, donc difficile de t'en dire plus. Qu'entends-tu plus précisément par "ne marche pas", qu'attends-tu comme comportement ?
A croire que en cas de choix multiples il faut que le choix le plus long soit présenté en premier dans le cas de caractères commun au 2 choix.
Oui et c'est le traitement attendu d'un "if(a||b)" en programmation sauf qu'on attend pas d'un "if(a||b)" de sélectionner ce qui a satisfait la condition... mais on peut tout de même émuler
Par contre si on cherche un mot complet et qu'une frontière tel que \b est suffisante, alors l'ancrage \b facilitera la tâche du "if regexp" qui backtrack-era pour chercher une solution... mais c'est toujours la première alternative à satisfaire la condition finale de gauche à droite comme un "if(a||b||c||etc)".
$data = 'un chien et une chienne font des chiots femelles ou mâles selon le chromosome Y qui ne sera pas autrichien ici.';
if(preg_match_all('#\bch(ien|ienne|iot)s?\b#', $data, $match)) {
print_r($match[0]); // Array ( [0] => chien [1] => chienne [2] => chiots )
}
Concernant le deuxième exemple, si je comprend bien c'est PARCE QU'IL Y A l'ancrage \b que le Regex est lu intégralement avant de commencer la recherche (Backtrack) et donc le problème des chaines dont on a parlé précédemment ne se pose pas.
Lorsque le mot "chienne" est rencontré dans la chaine source la première alternative "ien" sera satisfaite, donc il y aura poursuite et tentative de matcher \b qui est la frontière \w\W ou \W\w ce qui sera un échec car "nn" est une frontière \w\w entre autre. Donc backtracking, soit retour sur la troisième lettre du mot "chienne" (donc "ienne") dans la chaine source et retour sur l’alternative dans l'expression pour tenter la seconde alternative qui est "ienne". Car sans cet ancrage dans l'expression, il va de soit que les 4 premières lettres de "chienne" sont "chien", l'ancrage opérera pour "autrichien" car \b précédent "ch" produira un échec immédiat sur le test "ic" qui est encore une fois une frontière \w\w.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'oubliez pas d'activer les erreurs PDO.