2009-02-19 6 views
0

Il s'agit plus d'une question d'expression régulière générique que d'une question spécifique à PHP.Regex analysant une syntaxe de chaîne personnalisée en PHP

Je me donne différentes chaînes qui peuvent ressembler à:

A/B/PA ID U/C/D

Et je suis en train d'extraire le segment des barres obliques moyen qui a des espaces ("/ PA ID U") en utilisant:

preg_match('/(\/PA .+)(\/.+|$)/', '', $matches);

Cependant, au lieu d'obtenir "/ PA ID U" comme je m'y attendais, je recevais "/ PA ID U/C/D".

Comment puis-je lui donner la priorité en faisant correspondre "/.+" à "$" dans ce dernier groupe?


Notes complémentaires:

j'ai besoin que le dernier groupe pour correspondre soit une autre «/somethingsomthing » ou « » parce que la chaîne varie beaucoup. Si je ne fais que correspondre au "/.+", je ne pourrai pas obtenir le "/ PA ID U" s'il est en fin de ligne, comme dans "A/B/PA ID U".

Fondamentalement, je dois être en mesure d'extraire des segments spécifiques comme ceci:

Étant donné: "A/B/PA ID U/PA ID U/C/D"

Extrait: (A), (B), (PA ID U), (PA ID U), (C), (D)


[UPDATE]

J'essaie d'éviter d'utiliser split() ou explode() car cela signifierait que je dois faire correspondre le motif "PA ID U" séparément. En plus de simplement extraire les segments séparés par des barres obliques, j'ai besoin de valider que les sous-chaînes correspondent à des modèles spécifiques.

Répondre

1

Votre expression régulière ne fonctionne pas parce que le .+ est d'être gourmand.Vous pouvez le corriger en ajoutant un modificateur non gourmand (un ?) à votre première .+ en tant que tel:

preg_match('/(\/PA .+?)(\/.+|$)/', '', $matches); 

Vous pourriez aussi faire:

'/\/(PA [^\/]+)(\/.+|$)/' 

je me suis déplacé la barre oblique en dehors des parens évitez de capturer cela (je présume que vous n'êtes pas intéressé par la barre oblique). Le [^\/]+ capturera n'importe quel caractère jusqu'à la barre oblique suivante.

+0

Exactement ce dont j'avais besoin! Merci! : D J'ai aussi trouvé cette solution exacte dans http://www.regular-expressions.info/repeat.html –

+0

Je suis un peu perdu ici. Je ne peux pas obtenir cette regex pour extraire le donné "A/B/PA ID U/PA ID U/C/D" en (A), (B), (PA ID U), (PA ID U), (C), (D). Quelle saveur de regex php utilise-t-il? Perl? Pythong? Tout autre? –

+0

preg_match est implémenté comme un appel à libpcre. PCRE = Expressions régulières compatibles Perl – wuputah

2

Je pense que vous pouvez utiliser plus efficacement split pour accomplir ce que vous voulez.

split('/',$string); 

Voir: php manual

0

necramirez,

(\w+\s?)+ 

devrait fonctionner