正则表达式匹配语法


Regular Expression matching syntax

我需要用其他东西替换方括号中任何文本的每个实例,每个方括号块都要单独处理。例如,以开头

[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);