删除 [] {} () 括号外的文本

www*_*.in 3 php regex regexp-replace

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

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

所需输出:
[123] {45} (67) (8) [9] {0}

代码尝试但失败:

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

The*_*ird 5

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

(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|[^][(){}]+
Run Code Online (Sandbox Code Playgroud)

解释

正则表达式演示| php 演示

示例代码

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

$result = preg_replace($re, '', $str);

echo $result;
Run Code Online (Sandbox Code Playgroud)

输出

[123]{45}(67)(8)[9]{0}
Run Code Online (Sandbox Code Playgroud)

如果要删除所有其他值:

(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|.
Run Code Online (Sandbox Code Playgroud)

正则表达式演示