【问题标题】:Unexpected subpatterns captured by preg_matchpreg_match 捕获的意外子模式
【发布时间】:2012-08-07 14:23:09
【问题描述】:

我在php中做一些正则表达式并使用preg_match()进行匹配;

我的文字可能如下所示:

 $imy = "...without sophisticated apparatus<div class="caption"><div class="caption-inner">
 <img src="http://dev.mysite.org/Heatmap.png" alt="" title="" class="image-thumbnail" />
 Caption text</div></div>Some more text...
 <img src="http://dev.mysite.org/Heatmap.png" alt="" title="" class="image-thumbnail" />blablah..."

我的目标是选择包含在“div”标签(包括“div”标签)中的“img”标签,或者如果它没有包含在 div 中,则只选择“img”。在每种情况下,我还想捕获“img”标签的 src 属性中包含的地址。

这是我使用的模式:

$imagepattern = '/<div class="caption-inner[^>]+>.*<img\b[^>]*\bsrc="([^">]*)"[^>]*>.*<\/div>(<\/div>)?|<img\b[^>]*\bsrc="([^">]*)"[^>]*>/Us';

它对于“div”封闭图像非常有效,但对于没有 div 的图像,我得到捕获的子模式的奇怪结果。

我反复调用 preg_match 并从主题字符串中删除匹配项,然后再将其重新发送到 preg_match。我对 preg_match 的调用如下所示:

preg_match($imagepattern,$imy,$image,PREG_OFFSET_CAPTURE)

与无 div 图像标签匹配时,我在图像数组中得到的内容如下所示:

$image = [0] => Array
        (
            [0] => <img src="http://dev.molmeth.org/Heatmap.png" alt="" title="" class="image-thumbnail" />
            [1] => 1
        )

    [1] => Array
        (
            [0] =>
            [1] => -1
        )

    [2] => Array
        (
            [0] =>
            [1] => -1
        )

    [3] => Array
        (
            [0] => http://dev.mysite.org/Heatmap.png
            [1] => 11
        )

$image 数组怎么会有 '2' 和 '3' 键?我不是只有一个子模式吗?这是因为模式中的“或”条件吗?

【问题讨论】:

    标签: preg-match pcre


    【解决方案1】:

    在您的 preg_match 表达式中,您有 3 个捕获组。

    整个表达式匹配因为 or (因为您搜索 div 包含图像或 divless 图像)

    对于无 div 图像,仅捕获组 3 将填充数据,捕获组 1 和 2 将为空。

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多