代码之家  ›  专栏  ›  技术社区  ›  Steven Mercatante Dimitri Kopriwa

需要有关regex的帮助以删除方括号和

  •  22
  • Steven Mercatante Dimitri Kopriwa  · 技术社区  · 15 年前

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

    例如,我需要 hello [quote="im sneaky"] world

    成为

    hello world

    这是我想用的,但它不起作用。

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

    我最后只是 hello quote="im sneaky" world

    谢谢

    3 回复  |  直到 11 年前
        1
  •  33
  •   Tom Mayfield    15 年前

    [和]是regex中的特殊字符。它们用于列出匹配的字符。 [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 text here .


    仅限于以下第一项]:

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

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


    注意,这些都不明确地处理空白。[和]两侧的空格将保留。

    还要注意,所有这些对于格式错误的输入都可能失败。不匹配的多个[s和]s可能导致意外结果。

        2
  •  8
  •   Andres SK    12 年前

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

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

    这将转换为:

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

    为此:

    这个很酷

        3
  •  1
  •   Amal Murali    11 年前

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

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