Php 使用正则表达式在括号之间捕获,括号中还包含一个特殊字符

Php 使用正则表达式在括号之间捕获,括号中还包含一个特殊字符,php,regex,preg-replace,Php,Regex,Preg Replace,我正在尝试使用preg_replace删除封装在方括号[]内的不需要的文本块,但只删除在方括号[]内任何位置包含一个或多个星号*的文本块 例如: 诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的 以上我想要[诸如此类]和[诸如此类**诸如此类] 我已经做到了: $new_string = preg_replace('/\[.*(\*).*\]/', '', $string); 但这会漏掉,或通过关闭括号并删除太多内容。请

我正在尝试使用preg_replace删除封装在方括号[]内的不需要的文本块,但只删除在方括号[]内任何位置包含一个或多个星号*的文本块

例如: 诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的诸如此类的

以上我想要[诸如此类]和[诸如此类**诸如此类]

我已经做到了:

$new_string = preg_replace('/\[.*(\*).*\]/', '', $string); 
但这会漏掉,或通过关闭括号并删除太多内容。

请尝试以下方法:

$new_string = preg_replace('/\[[^\]]*(\*)[^\]]*\]/', '', $string);
不同之处在于,您查找的不是一些任意字符,而是一些字符,而是右括号,这是必要的,因为regexp是贪婪的,否则会查找最后一个右括号。有点难读,因为所有的括号,星号和转义

它将输出

blah blah blah blah [ blah ] blah blah  [] [ blah ] blah 

你想用更具体的东西来代替match all
*
,比如»除方括号以外的任何东西«来进行匹配。一个测试并详细理解它的好地方是