2012-03-31 2 views
2

Мне нужно заменить каждый экземпляр любого текста в квадратных скобках чем-то другим, причем каждый квадрат квадратной скобки обрабатывается отдельно. Например, начните с:Синтаксис соответствия регулярному выражению

[quote author=joe link=topic=765.msg4476#msg4476 date=1330380346] This is the quoted text [/quote] This is the new post

превращается в:

** This is the quoted text ** This is the new post

Я попытался с помощью следующих действий:

preg_replace('/\[.*\]/', '**', $msgtext); 

Что я получаю:

** This is the new post

Кажется, что это соответствует первому символу '[' до последнего ']' всей строки, даже если в большом тексте есть куча отдельных блоков квадратных скобок. Как изменить мое регулярное выражение для замены каждого блока между квадратными скобками отдельно? Очевидно, что мой. * В регулярном выражении соответствует всем, включая правые скобки, до последнего, но я хочу, чтобы он остановился в первой правой скобке, с которой он сталкивается, а затем повторил эту логику во всей строке.

ответ

4

Вы должны использовать нежадным матч, либо с помощью /U флаг, чтобы весь образец жадный:

preg_replace('/\[.*\]/U', '**', $msgtext); 

или с помощью .*? («ноль или более, и предпочтительно как можно меньше») вместо .* ("ноль или более, и предпочтительно больше, чем возможно "):

preg_replace('/\[.*?\]/', '**', $msgtext); 

В качестве альтернативы, вы можете использовать [^\]] (" любой символ, кроме ] ") вместо . (" любой символ, кроме символа новой строки "):

preg_replace('/\[[^\]]*\]/', '**', $msgtext); 
+0

Спасибо, ребята, все вышеописанное работает как шарм. Я использовал любой символ, кроме версии, но не жадный бы работал и получил тот же результат. Решаемые. –

+0

@BenCahan вы должны принять ответ (нажав галочку под голосами), если вы считаете, что ответили на ваш вопрос. – cmbuckley

1

По умолчанию регулярное выражение в PHP сделать жадные соответствия, вам нужно установить это ungreedy (например, с помощью переключателя ˙U)

preg_replace('/\[.*\]/U', '**', $msgtext); 
1

Это работает для меня:

preg_replace('/\[[^\]]*\]/', '**', $msgtext); 
+0

упс! сразу после публикации пика ruakh 3-й ответ такой же. Я голосую за это – sdjuan

Смежные вопросы