How to remove square brackets and anything between them with a regex?

前端 未结 3 1961
野的像风
野的像风 2020-11-28 11:39

How can I remove text from between square brackets and the brackets themselves?

For example, I need:

hello [quote=\"im sneaky\"] world
相关标签:
3条回答
  • 2020-11-28 12:23

    [ and ] are special characters in a regex. They are used to list characters of a match. [a-z] matches any lowercase letter between a and z. [03b] matches a "0", "3", or "b". To match the characters [ and ], you have to escape them with a preceding \.

    Your code currently says "replace any character of [](). with an empty string" (reordered from the order in which you typed them for clarity).


    Greedy match:

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

    A greedy match could match multiple [s and ]s. That expression would take an example [of "sneaky"] text [with more "sneaky"] here and turn it into an example here.

    Perl has a syntax for a non-greedy match (you most likely don't want to be greedy):

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

    Non-greedy matches try to catch as few characters as possible. Using the same example: an example [of "sneaky"] text [with more "sneaky"] here becomes an example text here.


    Only up to the first following ]:

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

    This is more explicit, but harder to read. Using the same example text, you'd get the output of the non-greedy expression.


    Note that none of these deal explicitly with white space. The spaces on either side of [ and ] will remain.

    Also note that all of these can fail for malformed input. Multiple [s and ]s without matches could cause a surprising result.

    0 讨论(0)
  • 2020-11-28 12:27

    I think you actually want parens for your outer brackets since it's a group. square brackets are a range of expressions. Not sure how to type it in SO.

    /(\\[.*\\])/
    
    0 讨论(0)
  • 2020-11-28 12:33

    Just in case you are looking for a recursive removal:

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

    That will convert this:

    This [text [more text]] is cool

    to this:

    This is cool

    0 讨论(0)
提交回复
热议问题