我需要用其他东西替换方括号中任何文本的每个实例,每个方括号块都要单独处理。例如,以开头
[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
它似乎从整个字符串的第一个"["字符到最后一个"]"字符都匹配,即使在较大的文本中有一堆单独的方括号。如何更改regex以单独替换方括号之间的每个块?很明显,正则表达式中的.*匹配所有内容,包括右括号,直到最后一个,但我希望它在遇到的第一个右括号处停止,然后在整个字符串中重复该逻辑。
您需要使用非贪婪匹配,或者使用/U
标志使整个模式贪婪:
preg_replace('/'[.*']/U', '**', $msgtext);
或使用.*?
("零或更多,最好尽可能少")代替.*
("零个或更多,更好尽可能多"):
preg_replace('/'[.*?']/', '**', $msgtext);
或者,您可以使用[^']]
("除]
之外的任何字符")而不是.
("除换行符之外的任何字符串"):
preg_replace('/'[[^']]*']/', '**', $msgtext);
默认情况下,PHP的regexp进行贪婪匹配,您需要将其设置为无自由(例如,使用u开关)
preg_replace('/'[.*']/U', '**', $msgtext);
这对我有效:
preg_replace('/'[[^']]*']/', '**', $msgtext);