如何使用正则表达式删除方括号和它们之间的任何东西?

时间:2010-03-01 23:36:29

标签: php regex

如何从方括号和括号之间删除文字?

例如,我需要:

hello [quote="im sneaky"] world

成为:

hello world

这是我正在尝试使用的内容,但它没有做到这一点:

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

我刚刚结束:

hello quote="im sneaky" world

3 个答案:

答案 0 :(得分:34)

[]是正则表达式中的特殊字符。它们用于列出匹配的字符。 [a-z]匹配az之间的任何小写字母。 [03b]匹配“0”,“3”或“b”。要匹配字符[],您必须使用前面的\转义它们。

您的代码目前说“将[]().的任何字符替换为空字符串”(为了清晰起见,请按照您输入的顺序重新排序)。


贪婪的比赛:

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

贪婪的比赛可以匹配多个[s和] s。该表达式需要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 ]

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


请注意,这些都没有明确涉及空格。 []两侧的空格将保留。

另请注意,所有这些都可能因格式错误的输入而失败。没有匹配的多个[]可能会导致令人惊讶的结果。

答案 1 :(得分:8)

以防您正在寻找递归删除:

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

那将转换为:

  

这[文字[更多文字]]很酷

到此:

  

这很酷

答案 2 :(得分:1)

我认为你真的想要你的外括号的parens,因为它是一个组。方括号是一系列表达式。不知道如何在SO中输入它。

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