PHP регулярное выражение: взгляд назад и вперед и проблема жадности

Это должно быть просто, но я нуб, и я не могу на всю жизнь понять это. Я пытаюсь использовать регулярное выражение для сопоставления текста внутри специальных тегов открытия / закрытия: [p2][/p2]

Итак, в этом тексте:

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

это должно соответствовать "банан" и "лимон". Регулярное выражение, над которым я до сих пор работал:

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

Но это слишком жадный. Он совпадает с буквой "b" в банане и заканчивается буквой "n" в лимоне, что соответствует банану [/ p2] grape [p2] lemon. Как мне подобрать банан и лимон?

2 ответа

Решение

Это должно сделать это:

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

Я добавил знак вопроса, чтобы сделать квантификатор не жадным.

Вместо использования модификатора регулярных выражений, вы можете использовать стандартный модификатор соответствия стиля Perl и добавить? после + или *, чтобы сказать, что определенная часть не жадная. Упомянуто выше, но конкретность может помочь.

Другие вопросы по тегам