
本文揭示了在PHP中使用preg_match()遍历数组时因变量重复赋值导致匹配结果丢失的核心问题,并提供正确收集所有匹配项的解决方案。
本文揭示了在php中使用preg_match()遍历数组时因变量重复赋值导致匹配结果丢失的核心问题,并提供正确收集所有匹配项的解决方案。
在PHP中,preg_match()函数用于执行一次正则匹配,并将匹配结果(如捕获组)写入传入的引用变量中。但许多开发者容易忽略一个关键细节:该函数不会自动追加结果,而是每次调用都重写目标数组。
在您提供的代码中:
$array = ['example1', '2example', 'no'];
$matches = [];
$var = "example";
foreach($array as $element) {
preg_match("/.*$var.*/", $element, $matches);
}
问题在于:$matches 在每次循环中都被 preg_match() 完全覆盖。当循环处理 'example1' 时,$matches 变为 ['example1'];处理 '2example' 时变为 ['2example'];而处理最后一个元素 'no' 时,因不匹配,$matches 被清空为 []——最终输出的正是这个空数组。
✅ 正确做法是:独立存储每次匹配结果,而非复用同一变量。推荐以下两种方式:
方式一:使用布尔值判断是否匹配(最常用)
$array = ['example1', '2example', 'no'];
$var = "example";
$found = [];
foreach ($array as $element) {
if (preg_match("/$var/", $element)) { // 简化正则:无需 .* 开头结尾
$found[] = $element;
}
}
print_r($found); // 输出: Array ( [0] => example1 [1] => 2example )
方式二:收集完整匹配信息(需保留$matches)
$array = ['example1', '2example', 'no'];
$var = "example";
$allMatches = [];
foreach ($array as $element) {
if (preg_match("/$var/", $element, $matches)) {
$allMatches[] = $matches; // 每次匹配结果单独存入新数组
}
}
print_r($allMatches); // 输出含匹配详情的二维数组
⚠️ 注意事项:
- 正则
/.*example.*/中的.*是冗余的——preg_match()默认只需部分匹配,直接写/example/更高效、更安全; - 若
$var来自用户输入,务必使用preg_quote($var, '/')防止特殊字符(如.,*,+)引发语法错误; - 如需全字符串精确匹配,请改用
/^example$/并注意转义锚点。
总结:preg_match() 的结果变量是“单次快照”,不是累积容器。要获取全部匹配项,必须显式构建结果数组,而非依赖循环末尾的 $matches 变量。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











