如何使用正则表达式删除方括号及其之间的内容?

28
如何删除方括号中的文本以及方括号本身?
例如,我需要:
hello [quote="im sneaky"] world

变成:

hello world

我尝试使用以下代码,但它并没有起作用:

preg_replace("/[\[(.)\]]/", '', $str);

我最终得到了:

hello quote="im sneaky" world
3个回答

44
[] 是正则表达式中的特殊字符,用于列举匹配的字符。[a-z] 匹配 az 之间的任何小写字母。[03b] 匹配 "0"、"3" 或 "b"。如果要匹配字符 [],需要在它们前面加上 \ 进行转义。

你的代码当前表示“用空字符串替换任何 [](). 的字符”(为了更清晰地排列顺序而重新排列了顺序)。


贪婪匹配:

preg_replace('/\[.*\]/', '', $str); // Replace from one [ to the last ]

贪婪匹配可能会匹配多个 [ 和 ]。该表达式将接受 an example [of "sneaky"] text [with more "sneaky"] here 并将其转换为 an example here

Perl 有一种非贪婪匹配的语法(你很可能不想贪婪):

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

非贪婪匹配尽量少地匹配字符。以同样的例子为例:an example [of "sneaky"] text [with more "sneaky"] here 变成 an example text here


只匹配到第一个后面的]:

preg_replace('/\[[^\]]*\]/', '', $str); // Find a [, look for non-] characters, and then a ]

这种写法更加明确,但难以阅读。使用相同的示例文本,您将获得非贪婪表达式的输出。


请注意,这些都不会显式处理空格。左右两侧的空格[]将保留。

还要注意,所有这些方法在遇到格式错误的输入时都可能失败。多个[]没有匹配可能会导致出人意料的结果。


嗯,输入格式错误可能是我会遇到的问题。有没有可能处理没有匹配的]的情况? - Steven Mercatante
我需要知道你希望如何处理它。对于格式不正确的输入,你希望它做什么? - Tom Mayfield
顺便提一下,如果你正在实现自定义标记语言,有一些非常好的完整替代方案比从头开始自己做要容易得多。 - Tom Mayfield
对于C#,这对我有用:https://stackoverflow.com/a/44314170/3873799 - alelom

13

如果您正在寻找递归删除的方法:

$str = preg_replace("/\[([^\[\]]++|(?R))*+\]/", "", $str);

这将转换为:

这是酷的


1

我认为你实际上想要在外部括号中使用括号,因为它是一个组。方括号是一系列表达式。不确定如何在SO中输入它。

/(\\[.*\\])/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接