【问题标题】:How to remove square brackets and anything between them with a regex?如何使用正则表达式删除方括号和它们之间的任何内容?
【发布时间】:2011-01-22 12:40:05
【问题描述】:

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

例如,我需要:

hello [quote="im sneaky"] world

变成:

hello world

这是我正在尝试使用的,但它没有起到作用:

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

我刚刚结束了:

hello quote="im sneaky" world

【问题讨论】:

    标签: php regex


    【解决方案1】:

    [] 是正则表达式中的特殊字符。它们用于列出匹配的字符。 [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 ]
    

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


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

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

    【讨论】:

    • 嗯,我可能会遇到格式错误的输入。是否可以处理没有匹配 ] 的实例?
    • 我必须知道您希望如何处理它。您希望它与格式错误的输入有什么关系?
    • 附带说明,如果您正在实现自定义标记语言,那么有一些非常好的完整替代方案,比您自己从头开始更容易投入使用。
    • 对于 C#,这对我有用:stackoverflow.com/a/44314170/3873799
    【解决方案2】:

    我认为您实际上需要括号作为外括号,因为它是一个组。方括号是一系列表达式。不知道如何在 SO 中输入。

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

    【讨论】:

      【解决方案3】:

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

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

      这将转换:

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

      到这里:

      这很酷

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-04
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 2023-02-11
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        相关资源
        最近更新 更多