正则表达式匹配语法

时间:2012-03-31 19:56:28

标签: php regex pattern-matching

我需要用方括号替换方括号中任何文本的每个实例,每个方括号块都要单独处理。例如,从:

开始

[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

它似乎是整个字符串中第一个'['字符到最后一个'''字符的匹配,即使在较大的文本中有一堆单独的方括号块。如何更改正则表达式以单独替换方括号之间的每个块?显然我的。*在正则表达式中匹配包括右括号在内的所有内容,直到最后一个,但我希望它在遇到的第一个右括号处停止,然后在整个字符串中重复该逻辑。

3 个答案:

答案 0 :(得分:4)

你需要使用非贪婪的匹配,使用/U标志使整个模式变得贪婪:

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

或使用.*?(“零或更多,最好尽可能少”)代替.*(“零或更多,最好尽可能多”):

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

或者,您可以使用[^\]](“]以外的任何字符”而不是.(“除换行符之外的任何字符”):

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

答案 1 :(得分:1)

默认情况下,PHP的正则表达式执行贪婪匹配,您需要将其设置为ungreedy(例如,通过使用u开关)

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

答案 2 :(得分:1)

这对我有用:

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