Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式匹配语法_Php_Regex_Pattern Matching - Fatal编程技术网

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