我需要用方括号替换方括号中任何文本的每个实例,每个方括号块都要单独处理。例如,从:
开始 [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
它似乎是整个字符串中第一个'['字符到最后一个'''字符的匹配,即使在较大的文本中有一堆单独的方括号块。如何更改正则表达式以单独替换方括号之间的每个块?显然我的。*在正则表达式中匹配包括右括号在内的所有内容,直到最后一个,但我希望它在遇到的第一个右括号处停止,然后在整个字符串中重复该逻辑。
答案 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);