【问题标题】:Remove text outside of [] {} () bracket删除 [] {} () 括号外的文本
【发布时间】:2021-02-20 17:03:57
【问题描述】:

我有一个字符串,我想将文本保留在一对括号内并删除括号外的所有内容:

你好 [123] {45} 世界 (67)
你好 (8) [9] {0}

期望的输出:
[123] {45} (67) (8) [9] {0}

代码尝试但失败:

$re = '/[^()]*+(\((?:[^()]++|(?1))*\))[^()]*+/';
$text = preg_replace($re, '$1', $text);

【问题讨论】:

    标签: php regex regexp-replace


    【解决方案1】:

    如果字符串中的值始终是左括号与右括号配对且没有嵌套部分,则可以匹配所有要保留的括号对,并匹配除括号外的所有其他字符删除。

    (?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|[^][(){}]+
    

    说明

    Regex demo | Php demo

    示例代码

    $re = '/(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|[^][(){}]+/m';
    $str = 'Hello [123] {45} world (67)
    Hello There (8) [9] {0}';
    
    $result = preg_replace($re, '', $str);
    
    echo $result;
    

    输出

    [123]{45}(67)(8)[9]{0}
    

    如果要删除所有其他值:

    (?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|.
    

    Regex demo

    【讨论】:

    • 我会将其标记为答案,只需要更多帮助 如果 $str 在我想要保留的括号之外还有一些其他字符(如 @#)怎么办。
    • @www.friend0.in 您可以将这些字符添加到最后的字符类中以排除匹配它们(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|[^][(){}@#]+regex101.com/r/kGLXjU/1
    • 嗨。只是一个后续问题:我需要做同样的事情,但不同的是我需要括号本身也消失,所以在你的例子中我需要它只返回“1234567890”。我需要改变什么?
    【解决方案2】:

    看起来你也想定位嵌套的东西。关于如何匹配平衡括号已经有questions。调整其中一种模式以满足您的需求,例如像

    $pattern = '/\((?:[^)(]*(?R)?)*+\)|\{(?:[^}{]*+(?R)?)*\}|\[(?:[^][]*+(?R)?)*\]/';
    

    您可以try this on Regex101。提取那些with preg_match_all and implode the matches

    if(preg_match_all($pattern, $str, $out) > 0)
      echo implode(' ', $out[0]);
    

    如果你需要匹配外面的东西,即使使用这种模式,你也可以使用(*SKIP)(*F) 也使用@Thefourthbird in his elaborately answer!用于跳过括号内的see this other demo

    【讨论】:

    • 好久没见到你了,但我记得你过去创造了一些很酷的图案。这个也很好:-) +1
    • 很高兴再次见到你@Thefourthbird :) 谢谢你!
    • 很棒的代码,它还保留了空间,从而提高了可读性。只需要一个帮助;如果 $str 在我想保留的括号之外还有一些其他字符,如 @# 怎么办。
    • @www.friend0.in 好吧,我只是用了一个空间来内爆 - 实际上外面什么都没有,你写了 remove all outside the bracket : )。如果您想保留原始空格或添加字符,只需将另一个替换附加到模式,例如:|[@# ] 并在空白处内爆。
    • @www.friend0.in 仅供参考,您也可以将此模式与(*SKIP)(*F) 一起使用,并匹配括号外的内容(类似于第四只鸟)see this demo - 不同之处在于它适用于嵌套的东西。
    【解决方案3】:

    如果括号没有嵌套,以下就足够了:

    [^[{(\]})]+(?=[[{(]|$)
    

    Demo.

    细分:

    [^[{(\]})]+     # Match one or more characters except for opening/closing bracket chars.
    (?=[[{(]|$)     # A positive Lookahead to ensure that the match is either followed by
                    # an opening bracket char or is at the end of the string.
    

    【讨论】:

    • 它也适合(这个)。我认为需要反向引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2020-08-18
    相关资源
    最近更新 更多