正则表达式匹配语法
我需要用方括号中的任何文本的每个实例替换其他东西,每个方括号块被分开处理。例如,先从:正则表达式匹配语法
[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
即使在较大的文本中有一堆单独的方括号块,它似乎与整个字符串中的第一个'['字符到最后一个']'字符相匹配。如何更改我的正则表达式以单独替换方括号之间的每个块?很明显,我的。*在正则表达式中匹配包括右括号在内的所有内容,直到最后一个,但我希望它停在它遇到的第一个右括号,然后在整个字符串中重复该逻辑。
您需要使用非贪婪的比赛,无论是使用所述/U
标志使整个图案贪婪:
preg_replace('/\[.*\]/U', '**', $msgtext);
或通过使用.*?
(“零个或多个,优选尽可能少的”),而不是.*
(“零个或多个,优选为多达可能 “):
preg_replace('/\[.*?\]/', '**', $msgtext);
或者,你可以使用[^\]]
(” 任何字符,除了]
“),而不是.
(” 任何字符除了换行符“):
preg_replace('/\[[^\]]*\]/', '**', $msgtext);
默认情况下,PHP的正则表达式做贪婪匹配,你需要将其设置为ungreedy(例如,通过使用U开关)
preg_replace('/\[.*\]/U', '**', $msgtext);
这个工作对我来说:
preg_replace('/\[[^\]]*\]/', '**', $msgtext);
哎呀!刚发布后看到了ruakh第三回答是一样的。我为此投了票 – sdjuan 2012-03-31 20:35:02
谢谢,伙计们,上述所有工作都像一个魅力。我使用了除版本以外的任何字符,但非贪婪的方式也能起作用,并得到相同的结果。解决了。 – 2012-03-31 20:52:07
@BenCahan如果你认为它回答了你的问题,你应该接受答案(通过点击下面的选票标记)。 – cmbuckley 2012-03-31 21:04:07