2010-09-01 4 views
4

Est-il possible d'obtenir toutes les correspondances d'expressions régulières en PHP? J'ai besoin d'un script qui, par exemple, correspondre à .+abc et donner le résultat:PHP: Comment obtenir toutes les correspondances d'expressions régulières?

Array (a, b, c, ab, bc, abc)

+0

Je pense que c'est ce que vous voulez: http://stackoverflow.com/questions/2617055/how-to-generate-all-permutations-of-a-string-in-php – shamittomar

+1

Ce n'est pas ce que les expressions régulières sont Il n'y a aucun moyen fiable de le faire, en plus d'écrire votre propre (sous-ensemble de) analyseur regex et de faire quelque chose de différent de toutes les autres implémentations de regex. – Wrikken

+0

@shamittomar Non, je pensais qu'il était assez clair que '. +' N'était qu'un exemple. – Tom

Répondre

1

Je ne suis pas sûr qu'il ya un défini ensemble de "toutes les correspondances" dans une expression régulière.

Par exemple, que se passe-t-il si votre motif est .+.+? Qu'est-ce qui correspond à la première .+? Qu'est-ce qui correspond à la seconde?

Une chaîne peut correspondre à une liaison RE particulière de plusieurs manières différentes, et quelle sous-chaîne est capturée par différentes parties de l'entité RE peut dépendre de choses comme la correspondance gloutonne ou non gloutonne. Mais il n'y a pas de façon définie d'itérer sur toutes les différentes captures possibles. Vous devez changer radicalement la façon dont les RE sont traités pour ce faire.

+0

'. +. +' Sur 'abc' donnerait Array (' ab', 'bc',' abc') – Tom

+0

Je comprends votre réponse, mais j'espère toujours une solution, comme une bibliothèque personnalisée qui peut répondre à mon prière :) – Tom

0

Je sais que la question est un peu ancienne, mais il y a peut-être quelqu'un qui a besoin de la réponse.

Regardez le paramètre flags pour preg_match_all fonction

1

La question est au chevauchement, vous voulez faire correspondre « ab » et aussi « bc » que vous ne serez pas en mesure de le faire avec un simple regex. Cependant, considérez ce qui suit.

Vous pouvez diviser sur tous les caractères avec l'une de ces lignes:

preg_match_all('/./', 'abc', $matches); 
str_split('abc'); 

vous donner: array ('a', 'b', 'c').

Et ce qui suit découpera paires de caractères avec le caractère restant:

preg_match_all('/.{2}|./', 'abc', $matches); 

vous donner: array ('ab', 'c');

Ainsi, vous pouvez jouer avec des combinaisons/variantes de ceux-ci pour atteindre votre résultat.

Questions connexes