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)
如果字符串中的值始终是左括号和右括号配对并且没有嵌套部分,则可以匹配所有要保留的括号对,并匹配除要删除的括号之外的所有其他字符。
(?:\[[^][]*]|\([^()]*\)|{[^{}]*})(*SKIP)(*F)|[^][(){}]+
Run Code Online (Sandbox Code Playgroud)
解释
(?: 非捕获组
\[[^][]*] 匹配来自 [...]| 或者\([^()]*\) 匹配来自 (...)| 或者{[^{}]*} 匹配来自 {...}) 关闭非捕获组(*SKIP)(*F)| 使用您想要避免的字符,并且不能是匹配结果的一部分[^][(){}]+ 匹配 1+ 次除 1 以外的任何字符示例代码
$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)
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |