【问题标题】:preg_match_all loop matchpreg_match_all 循环匹配
【发布时间】:2017-04-25 23:44:51
【问题描述】:
<?php
$arr = array();
$html = "<p class='images'>
<img src='URL1'>
<img src='URL2'>
<img src='URL3'>
<img src='URL4'>

</p>

<p><img src='ThisNot'></p>
";
preg_match_all('/<p class=\'images\'>(?:\s*<img src=\'([^\']*)\'>\s*)*\s*<\/p>/ism', $html,$arr);


print_r($arr);

输出

Array (
    [0] => Array
        (
            [0] => <p class='images'> <img src='URL1'> <img src='URL2'> <img src='URL3'> <img src='URL4'>

</p>
        )

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

)

正则表达式 * 只返回 preg_match_all 中的最后一个匹配 匹配已经发生但没有返回到输出数组 如何获取所有的 URL?

当我尝试使用两个 preg_match_all 第一个来获取时,它起作用了

内容,然后匹配所有图像,但我想只获得一个

【问题讨论】:

  • 为什么不使用 DOMDocument? php.net/manual/en/class.domdocument.php
  • 我认为单行正则表达式不可能做到这一点。当在重复匹配中找到一个新组时,它不会存储前一个组。但是使用两个 preg_match_all 有什么问题?

标签: php regex preg-match-all


【解决方案1】:

你可以用 DOMDocument 做到这一点:

$html = "<p class='images'>
<img src='URL1'>
<img src='URL2'>
<img src='URL3'>
<img src='URL4'>

</p>

<p><img src='ThisNot'></p>
";

$dom = new DOMDocument;
$dom->loadHTML($html);
$tags = $dom->getElementsByTagName('p');
$urls = array();
foreach($tags as $p){
    if($p->getAttribute('class') == "images"){
        $imgs = $p->getElementsByTagName('img');
        foreach($imgs as $img){
            $urls[] = $img->getAttribute('src');
        }
    }
}
print_r($urls);

输出:

Array
(
    [0] => URL1
    [1] => URL2
    [2] => URL3
    [3] => URL4
)

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2011-12-28
    • 2015-03-14
    相关资源
    最近更新 更多