从 preg_match_all 获取多个值并使用 foreach

Get multiple values from preg_match_all and use of foreach

我已尝试为我的特定问题找到解决方案。我有一个正则表达式,可以在其中找到两个特定值。这些值需要在 foreach 循环中组合。

字符串

$artikel = "This is some random text. I want to show you this image: [img alt=alt text for this image]the-image.gif[/img]";

所以我将这个正则表达式与 preg_match_all 一起使用来获取替代文本和图像本身:

preg_match_all('/\[img alt=(.*?)\](.+?)\[\/img\]/i', $artikel, $matches);

我可以使用 print_r($matches[1]);print_r($matches[2]);

单独获取结果

问题是我真的不知道如何进行组合的 foreach 循环。我想将图像连同相关的替代文本插入到我的数据库中。

像这样:

foreach ($matches as $match){
    //example code
    $stmt = $conn->prepare("INSERT INTO images (img_file, img_alt_text) VALUES (?, ?)");
    $stmt->bind_param("ss", $img_file, $img_alt_text);

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

如果您更改返回匹配项的顺序,就可以做到这一点。使用 PREG_SET_ORDER,您将以更容易迭代的格式获得它们。

preg_match_all('/\[img alt=(.*?)\](.+?)\[\/img\]/i', $artikel, $matches, PREG_SET_ORDER);

foreach ($matches as $match){
    //example code
    $stmt = $conn->prepare("INSERT INTO images (img_file, img_alt_text) VALUES (?, ?)");
    $stmt->bind_param("ss", $img_file, $img_alt_text);

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

我认为每个图像不会总是有一个 alt(如果有 - 只需迭代每一对(比如循环内的索引 % 2 条件)。

我建议您分两个阶段处理 $article 字符串:

  1. 查找所有图像(比如括号中的整个图案)
  2. 然后:遍历结果并找到与您的确切模式匹配的子匹配项。