2009-11-13 2 views
5

Questo dovrebbe essere semplice ma sono un noob e non posso per la vita di me capirlo. Sto cercando di usare espressioni regolari per abbinare il testo all'interno di speciali tag di chiusura/apertura: [p2] [/ p2]php regex: lookbehind e lookahead e greediness problem

Quindi, in questo testo:

apple [p2]banana[/p2] grape [p2]lemon[/p2] 

dovrebbe corrispondere "banana" e "limone ". La regex che ho elaborato finora è:

(?<=\[p2\]).+(?=\[\/p2\]) 

Ma questo è troppo goloso. Corrispondenza che inizia con la "b" nella banana e termina con la "n" in limone, corrispondente a banana [/ p2] uva [p2] limone. Come faccio ad abbinare banana e limone?

+1

ovviamente, non appena inserisco questo messaggio penso di averlo finalmente capito: (? <= \\ [p2 \\]). +? (? = \\ [\/p2 \\]) giusto? –

+0

Infatti. Hai ragione. – Franz

risposta

5

Questo dovrebbe farlo:

(?<=\[p2\]).+?(?=\[\/p2\]) 

ho aggiunto il punto interrogativo per fare il quantificatore non avidi.

+0

grazie per la risposta –

+1

In alternativa, è possibile specificare il modificatore 'U' per indicare che tutti i quantificatori nel modello devono essere considerati non-golosi, ad es. 'preg_match ('/ (? <= \ [p2 \]). + (? = \ [\/p2 \])/U', ....' Nota il carattere ** maiuscolo ** 'U' ​​verrà automaticamente converti il ​​segno '+ 'in non-goloso, e un trailing'? '(operatore di avidità) lo farebbe mostrare il comportamento che stai descrivendo. Vale la pena conoscere Vedi: http://us2.php.net/manual /en/reference.pcre.pattern.modifiers.php – Dereleased

+0

@Dereleased: Non capisco esattamente qual è la differenza? Grazie per il commento, però. – Franz

0

Invece di utilizzare un modificatore di espressioni regolari, è possibile utilizzare il modificatore di corrispondenza stile perl standard e aggiungere un? dopo + o * per dire che la parte specifica non è golosa. Citato sopra, ma la specificità può aiutare.