Php 正则表达式匹配语法
我需要用其他内容替换方括号中任何文本的每个实例,每个方括号块都要单独处理。例如,从以下内容开始:Php 正则表达式匹配语法,php,regex,pattern-matching,Php,Regex,Pattern Matching,我需要用其他内容替换方括号中任何文本的每个实例,每个方括号块都要单独处理。例如,从以下内容开始: [quote author=joe link=topic=765.msg4476#msg4476 date=1330380346]这是引用的文本[/quote]这是新帖子 变成: **这是引用的文本**这是新帖子 我尝试使用以下方法: preg_replace('/\[.*\]/', '**', $msgtext); 我得到的是: **这是新帖子 它似乎是从整个字符串中的第一个“[”字符到最后一个
[quote author=joe link=topic=765.msg4476#msg4476 date=1330380346]这是引用的文本[/quote]这是新帖子
变成:
**这是引用的文本**这是新帖子
我尝试使用以下方法:
preg_replace('/\[.*\]/', '**', $msgtext);
我得到的是:
**这是新帖子
它似乎是从整个字符串中的第一个“[”字符到最后一个“]”字符进行匹配,即使在较大的文本中有一组单独的方括号。如何更改正则表达式以分别替换方括号之间的每个块?显然,正则表达式中的my.*在最后一个括号之前一直在匹配所有内容,包括右括号,但我希望它在遇到的第一个右括号处停止,然后在整个字符串中重复该逻辑。默认情况下,PHP的regexp进行贪婪匹配,您需要将其设置为ungreedy(例如,使用u开关) 您需要使用非贪婪匹配,或者使用
/U
标志使整个模式贪婪:
preg_replace('/\[.*\]/U', '**', $msgtext);
或者使用*?
(“零或更多,最好尽可能少”)代替*
(“零或更多,最好尽可能多”):
或者,您可以使用[^\]
(]
以外的任何字符)代替
(“除换行符以外的任何字符”):
这对我很有用:
preg_replace('/\[[^\]]*\]/', '**', $msgtext);
哎呀!刚刚发帖后看到鲁克的第三个答案是一样的。我投赞成票谢谢,伙计们,所有这些都很有魅力。我使用了除版本之外的任何字符,但非贪婪字符也可以工作,并得到相同的结果。已解决。@BenCahan如果您认为答案回答了您的问题,您应该接受答案(通过单击选票下方的复选标记)。
preg_replace('/\[.*?\]/', '**', $msgtext);
preg_replace('/\[[^\]]*\]/', '**', $msgtext);
preg_replace('/\[[^\]]*\]/', '**', $msgtext);