0

我正在尝试获取某些页面上的图像来源,但两个页面的代码之间存在一些差异。

第 1 页代码:

<img class="thumb thumb_0" onclick="setImage(0); return false;" src="http://example.com/b1.jpg">

第 2 页代码:

<img style="width: 46px ! important; height: 46px ! important;" class="thumb thumb_0" onclick="setImage(0); return false;" src="http://example.com/image4.jpg">

注意 2 页之间的区别... 第 2 页在 img 标签的开头有一个愚蠢的样式。此外,“onclick”位于不同的位置。我唯一需要了解的是图像位置。

这是我到目前为止的代码......仅适用于第 1 页的场景:

preg_match_all("/<img\s*?class='thumb.*?'.*?src='(.*?)'.*?\/>/is", $hotelPage, $thumbs, PREG_PATTERN_ORDER);

理想情况下,我希望能够将其保留在一个 php 行中。如何在 preg_replace 中执行“或”以及如何让正则表达式也适用于第 2 页?

先感谢您!

更新:这些页面有其他图像,我只是在寻找具有包含“thumb”的类的那些。我很抱歉遗漏了那个重要的细节。

4

4 回答 4

2

网络上有多个关于 HTML 属性的正则表达式示例。应该适用于您的两种特定情况以及几乎任何其他 image-src 的一种方法是:

preg_match_all("/<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>/", $hotelPage, $thumbs);

可以在此处找到有关此特定正则表达式的详细信息:Regular expression to get an attribute from HTML tag

处理 'class="thumb*"' 规则的更多修改版本是:

preg_match_all("/<img[^>]+class=\"thumb[^\"]*\"[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>/", $hotelPage, $thumbs);
于 2012-07-11T20:11:53.703 回答
1

这应该可以按您的预期工作 - 如果您的 html 位于$html,则正则表达式应如下所示$reg

$html='some html <img class="thumb thumb_0" onclick="setImage(0); return false;"
   src="http://example.com/b1.jpg"> xxx yyy <img class="bummer thumb_0"
   onclick="setImage(0); return false;" src="http://example.com/bummer.jpg">
   <img style="width: 46px ! important; height: 46px ! important;"
   class="thumb thumb_0" onclick="setImage(0); return false;"
   src="http://example.com/image4.jpg"> some html';

$reg = ' <img .+?                # img tag
         class="thumb .+?        # class tag
         src="([^"]+)            # capture src
       ';

preg_match_all("/$reg/xis", $html, $thumbs, PREG_SET_ORDER);

foreach($thumbs as $t) echo $t[1]."\n";

只有属性的顺序是{class, src}并且找到了 img-tag 和正确的类“thumb”时,它才匹配。开始了:

http://example.com/b1.jpg
http://example.com/image4.jpg

三个 img 条目中只有两个匹配(我在测试集中包含了第三个错误的链接)。

问候

rbo

于 2012-07-11T20:30:52.967 回答
0

如果您想要的src只是 ,那么您应该忽略正则表达式中的所有其他内容。

尝试:

/<img\s.*src='(.*)'.*>/iu

作为你的正则表达式。

于 2012-07-11T20:10:15.847 回答
0

不建议使用正则表达式解析 xml/html。你应该看到这个问题:RegEx match open tags except XHTML self-contained tags

您可以做的是使用 DOMDocument 之类的东西来找出网址:

$html = '<img class="thumb thumb_0" onclick="setImage(0); return false;" src="http://example.com/b1.jpg">
<img style="width: 46px ! important; height: 46px ! important;" class="thumb thumb_0" onclick="setImage(0); return false;" src="http://example.com/image4.jpg">';

$dom = new DOMDocument();
$dom->loadHTML($html);
$images = $dom->getElementsByTagName('img');

$image_urls = array();
foreach ($images as $image) {

    // only match images with class thumb
    if (strpos(' ' . $image->getAttribute('class') . ' ', ' thumb ') !== false) {
        $image_urls[] = $image->getAttribute('src');
    }
}

var_dump($image_urls);
于 2012-07-11T20:12:55.627 回答