电话
400 9058 355
最可靠方法是用正则非贪婪匹配单层括号内内容,如/(?(1*))/;嵌套场景需循环扫描计数或改用手动解析,PCRE递归易栈溢出不推荐。() ↩
preg_match_all 捕获括号内的内容最可靠直接用 explode 或 str_split 分割括号会漏掉嵌套、忽略配对、无法提取内容——正则才是正确解法。核心是匹配成对括号之间的内容,但注意:PHP 的 PCRE 不支持无限递归,简单场景用非贪婪匹配即可。
常见错误是写成 /\((.*)\)/,结果跨括号全吞了(比如 (a(b)) 只捕获到 a(b)。应该用非贪婪+排除右括号:
/(?\([^()]*\))/ :只匹配一层无嵌套的括号,$matches['name'] 是完整括号串(含括号)/(?\(([^()]*)\))/ :捕获括号内纯内容(不含括号),$matches['content'] 是中间部分【】、「」),需在字符类里显式添加,如 /\(([^()【】]*)\)/u 并加 u 修饰符PCRE 原生不支持通用嵌套匹配((?R) 在 PHP 中受限且易栈溢出),别硬刚正则。实际项目中更稳妥的做法是手动扫描:
ext/pcre 的 (?R),但必须确保输入可控,否则 PREG_RECURSION_LIMIT_ERROR 很容易触发示例循环法片段:
$text = "func(a, inner(b, c), d)";
$stack = [];
$result = [];
for ($i = 0; $i < strlen($text); $i++) {
if ($text[$i] === '(') {
$stack[] = $i;
} elseif ($text[$i] === ')' && !empty($stack)) {
$start = array_pop($stack);
if (empty($stack)) {
$result[] = substr($text, $start + 1, $i - $start - 1);
}
}
}preg_split 分割括号本身(不是内容)要小心空元素如果目标只是把文本按括号字符切开(比如 "a(b)c" → ['a', 'b', 'c']),用 preg_split 更轻量,但默认会保留空字符串和括号位置信息:
preg_split('/[()]/', $text) 返回 ['a', 'b', 'c'],但若开头结尾是括号(如 "(a)"),会得到 ['', 'a', '']
PREG_SPLIT_NO_EMPTY 过滤空项:preg_split('/[()]/', $text, -1, PREG_SPLIT_NO_EMPTY)
preg_match_all('/([()])/', $text, $m) 拿位置,再手动切片用户输入不可信时,( 和 ((U+FF08)是两个不同字符,正则不写全就会漏。还有转义场景:文本里出现 \(literal\) 应该跳过。
/\p{Ps}|\p{Pe}/u(需 u 修饰符),但性能略低;更常用的是显式枚举:/[()()【】〔〕《》「」『』]/u
/(?,但注意 PHP 字符串里反斜杠要双写
()、连续括号 (())、括号在行首/尾、含换行符的括号块真正难的从来不是写对一行正则,而是想清楚括号的语义:它代表分组?参数列表?注释?还是

邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...