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

2022-08-30 15:38:21

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

例如,我需要:

hello [quote="im sneaky"] world

成为:

hello world

以下是我试图使用的内容,但它并没有解决问题:

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

我只是最终得到:

hello quote="im sneaky" world

答案 1

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

您的代码当前显示“将 的任何字符替换为空字符串”(为清楚起见,按键入的顺序重新排序)。[]().


贪婪的比赛:

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

贪婪的匹配可以匹配多个 [s 和 ]s。该表达式将采用并将其转换为 .an example [of "sneaky"] text [with more "sneaky"] herean example here

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

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

不贪婪的匹配会尝试捕获尽可能少的字符。使用相同的示例:变为 。an example [of "sneaky"] text [with more "sneaky"] herean example text here


最多只能达到以下第一个 ]:

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

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


请注意,这些都没有明确处理空白。和 两侧的空间将保留。[]

另请注意,由于输入格式不正确,所有这些都可能失败。多个 s 和 s 没有匹配项可能会导致令人惊讶的结果。[]


答案 2

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

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

这将转换这个:

这个[文本[更多文本]]很酷

对此:

这很酷


推荐