如何使用正则表达式删除方括号和它们之间的任何内容?
如何从方括号和方括号本身之间删除文本?
例如,我需要:
hello [quote="im sneaky"] world
成为:
hello world
以下是我试图使用的内容,但它并没有解决问题:
preg_replace("/[\[(.)\]]/", '', $str);
我只是最终得到:
hello quote="im sneaky" world
如何从方括号和方括号本身之间删除文本?
例如,我需要:
hello [quote="im sneaky"] world
成为:
hello world
以下是我试图使用的内容,但它并没有解决问题:
preg_replace("/[\[(.)\]]/", '', $str);
我只是最终得到:
hello quote="im sneaky" world
[
并且是正则表达式中的特殊字符。它们用于列出匹配项的字符。 匹配 和 之间的任何小写字母。 匹配“0”、“3”或“b”。要匹配字符 和 ,必须用前面的 .]
[a-z]
a
z
[03b]
[
]
\
您的代码当前显示“将 的任何字符替换为空字符串”(为清楚起见,按键入的顺序重新排序)。[]().
贪婪的比赛:
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 ]
这更明确,但更难阅读。使用相同的示例文本,您将获得非贪婪表达式的输出。
请注意,这些都没有明确处理空白。和 两侧的空间将保留。[
]
另请注意,由于输入格式不正确,所有这些都可能失败。多个 s 和 s 没有匹配项可能会导致令人惊讶的结果。[
]
以防万一您正在寻找递归删除:
$str = preg_replace("/\[([^\[\]]++|(?R))*+\]/", "", $str);
这将转换这个:
这个[文本[更多文本]]很酷
对此:
这很酷