如何从方括号和括号之间删除文字?
例如,我需要:
hello [quote="im sneaky"] world
成为:
hello world
这是我正在尝试使用的内容,但它没有做到这一点:
preg_replace("/[\[(.)\]]/", '', $str);
我刚刚结束:
hello quote="im sneaky" world
答案 0 :(得分:34)
[
和]
是正则表达式中的特殊字符。它们用于列出匹配的字符。 [a-z]
匹配a
和z
之间的任何小写字母。 [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中输入它。
/(\\[.*\\])/