如何从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
相关产品推荐
相关产品推荐

