【发布时间】:2013-12-27 17:44:48
【问题描述】:
我需要删除包含在 [ 和 ] 括号(以及括号)之间的文本。
例如:
你好,[你好吗]
必须变成:
你好,
还有一个字符串,如:
你好,[怎么样][是]你
必须变成:
你好,你
有一个正则表达式可以做到这一点吗?
【问题讨论】:
-
嵌套怎么样?是否需要处理
[foo[bar]baz]之类的字符串? -
还有多余的空格,要不要去掉?
我需要删除包含在 [ 和 ] 括号(以及括号)之间的文本。
例如:
你好,[你好吗]
必须变成:
你好,
还有一个字符串,如:
你好,[怎么样][是]你
必须变成:
你好,你
有一个正则表达式可以做到这一点吗?
【问题讨论】:
[foo[bar]baz]之类的字符串?
您只需要使用preg_replace 函数删除[] 之间的所有内容。
$a = 'hello, [how][are] you';
echo preg_replace('#\s*\[.+\]\s*#U', ' ', $a); // hello, you
正则表达式捕获前后的每个空格并将其替换为单个空格。
注意,[ 和] 是正则表达式中的保留字符,您需要使用\ 对其进行转义。如果您想保留在您的字符串中写入[] 的可能性(中间没有任何内容),您可以将.* 转换为.+。
【讨论】:
Hello, [how [are] you]?会发生什么我的猜测是它会导致Hello, you]?。 (未验证)如果保证不会发生此类构造,Maxime 的解决方案应该有效。
[] 分隔的两个元素之后应该连接起来。但这是我个人的解释:)
preg_replace('~\[.*?\]\s?~', '', $str)?
如果你想处理嵌套括号和额外的水平空格,你可以使用它:
$txt = preg_replace('~\h*\[(?:[^][]+|(?R))*+]\h*~', ' ', $txt);
或使用展开的循环:
$txt = preg_replace('~\h*\[[^][]*+(?:(?R)[^][]*)*+]\h*~', ' ', $txt);
【讨论】:
这个怎么样?
print preg_replace('/\[[^\[\]]*\]/', '', $str);
【讨论】:
使用此模式\[.*?\](?![^\[\]]*\]) 也可以处理嵌套Demo
【讨论】: