preg_match返回值为0、1或false,仅表示匹配是否成功或出错,不返回匹配内容;匹配结果存于$matches参数中,$matches[0]为完整匹配串,后续索引对应捕获组。

preg_match 返回值不是匹配内容,而是匹配动作的结果状态:0、1 或 FALSE。 它不返回数组,也不返回字符串——这点和很多初学者直觉相反。真正装匹配结果的是你传进去的 $matches 参数(如果提供了的话)。
preg_match 返回 0、1、FALSE 分别代表什么
这是最常被误解的一点:返回值只告诉你“有没有成功匹配一次”,不反映内容。
-
1:找到至少一个匹配,立刻停止搜索,函数返回 1 -
0:遍历完整个$subject都没找到匹配,返回 0 -
FALSE:出错了,比如正则语法错误、pcre.backtrack_limit超限、或$pattern是空字符串等
注意:if (preg_match(...)) 这种写法在匹配成功时为真,在无匹配时为假,但一旦出错(返回 FALSE),也会被判定为假——你无法区分“没匹配”和“出错了”。所以生产环境建议显式判断:
if (($ret = preg_match($pattern, $subject, $matches)) === false) {
// 处理错误,比如检查 error_get_last()
} elseif ($ret === 1) {
// 成功匹配,$matches 已填充
} else {
// $ret === 0,无匹配
}
为什么 $matches 数组里有多个元素
$matches 是按捕获组结构组织的,不是按“第几个匹配”排列的——因为 preg_match 只做一次匹配。
-
$matches[0]:整个正则匹配到的完整字符串 -
$matches[1]:第一个()捕获组的内容(如果有) -
$matches[2]:第二个()的内容,依此类推 - 如果用了
PREG_OFFSET_CAPTURE标志,每个元素变成[匹配字符串, 偏移量]数组
例如:preg_match('/(\w+): (\d+)/', 'name: 42', $m) → $m[0] === 'name: 42',$m[1] === 'name',$m[2] === '42'。
preg_match 和 preg_match_all 的返回值根本不是一回事
很多人把两者混用,结果逻辑崩坏。关键差异就三点:
-
preg_match返回int|false,只关心“是否命中一次” -
preg_match_all返回int|false,但这个int是“总共命中多少次”(可能为 0、1、5、100…) -
preg_match_all填充的$matches是多维数组,结构受$flags控制(PREG_PATTERN_ORDER或PREG_SET_ORDER),而preg_match的$matches总是单层索引数组
想查字符串里有没有某个模式?用 preg_match。想提取全部邮箱或所有 HTML 标签?必须换 preg_match_all,否则永远只拿到第一个。
最容易被忽略的是:preg_match 不会自动跳过前导空白或忽略大小写,除非你在 $pattern 里显式加修饰符(如 /i、/s)。另外,它的性能比 strpos 差很多——如果只是判断子串是否存在,别硬套正则。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











