You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从preg_match_all获取多组匹配值并通过foreach循环配对使用

解决方法

preg_match_all 默认返回 PREG_PATTERN_ORDER 结构的结果,$matches[1] 存储所有匹配到的alt文本,$matches[2] 存储所有匹配到的图片文件名,相同索引的元素就是天然配对的一组数据,你可以通过遍历索引的方式配对取值:

// 原有匹配逻辑不变
preg_match_all('/\[img alt=(.*?)\](.+?)\[\/img\]/i', $artikel, $matches);

// 预处理语句放在循环外性能更好,不需要每次循环重复创建
$stmt = $conn->prepare("INSERT INTO images (img_file, img_alt_text) VALUES (?, ?)");
$stmt->bind_param("ss", $img_file, $img_alt_text);

// 遍历索引配对取值
foreach ($matches[1] as $index => $img_alt_text) {
    $img_file = $matches[2][$index];
    $stmt->execute();
}

如果你想要用示例中直接遍历$match取子元素的写法,可以在preg_match_all中添加第三个参数 PREG_SET_ORDER,修改后匹配结果的每个子项就是一组完整的配对数据:

// 加第三个参数调整匹配结果的排序方式
preg_match_all('/\[img alt=(.*?)\](.+?)\[\/img\]/i', $artikel, $matches, PREG_SET_ORDER);

$stmt = $conn->prepare("INSERT INTO images (img_file, img_alt_text) VALUES (?, ?)");
$stmt->bind_param("ss", $img_file, $img_alt_text);

foreach ($matches as $match) {
    $img_alt_text = $match[1];
    $img_file = $match[2];
    $stmt->execute();
}

补充优化建议

如果你的自定义img标签的alt属性有可能包裹引号(比如[img alt="带空格的alt"]xxx.jpg[/img]),现有正则会把引号也匹配到alt文本中,可以调整正则兼容带引号的写法:

// 兼容alt带单引号/双引号/无引号的情况
preg_match_all('/\[img alt=(["\']?)(.*?)\1\](.+?)\[\/img\]/i', $artikel, $matches, PREG_SET_ORDER);

内容的提问来源于stack exchange,提问作者Niels Hermann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:06:03