2012-03-31 108 views
2

我需要用方括号中的任何文本的每个实例替换其他东西,每个方括号块被分开处理。例如,先从:正则表达式匹配语法

[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

即使在较大的文本中有一堆单独的方括号块,它似乎与整个字符串中的第一个'['字符到最后一个']'字符相匹配。如何更改我的正则表达式以单独替换方括号之间的每个块?很明显,我的。*在正则表达式中匹配包括右括号在内的所有内容,直到最后一个,但我希望它停在它遇到的第一个右括号,然后在整个字符串中重复该逻辑。

回答

4

您需要使用非贪婪的比赛,无论是使用所述/U标志使整个图案贪婪:

preg_replace('/\[.*\]/U', '**', $msgtext); 

或通过使用.*?(“零个或多个,优选尽可能少的”),而不是.*(“零个或多个,优选为多达可能 “):

preg_replace('/\[.*?\]/', '**', $msgtext); 

或者,你可以使用[^\]](” 任何字符,除了] “),而不是.(” 任何字符除了换行符“):

preg_replace('/\[[^\]]*\]/', '**', $msgtext); 
+0

谢谢,伙计们,上述所有工作都像一个魅力。我使用了除版本以外的任何字符,但非贪婪的方式也能起作用,并得到相同的结果。解决了。 – 2012-03-31 20:52:07

+0

@BenCahan如果你认为它回答了你的问题,你应该接受答案(通过点击下面的选票标记)。 – cmbuckley 2012-03-31 21:04:07

1

默认情况下,PHP的正则表达式做贪婪匹配,你需要将其设置为ungreedy(例如,通过使用U开关)

preg_replace('/\[.*\]/U', '**', $msgtext); 
1

这个工作对我来说:

preg_replace('/\[[^\]]*\]/', '**', $msgtext); 
+0

哎呀!刚发布后看到了ruakh第三回答是一样的。我为此投了票 – sdjuan 2012-03-31 20:35:02