0

一部のページで画像のソースを取得しようとしていますが、2つのページのコードにいくつかの違いがあります。

ページ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);

理想的には、1つのphp行に保持できるようにしたいと思います。preg_replaceで「または」を実行するにはどうすればよいですか。また、2ページ目でも正規表現を機能させるにはどうすればよいですか。

前もって感謝します!

更新:ページには他の画像があります。「thumb」を含むクラスを持つ画像のみを探しています。その重い詳細を省略して申し訳ありません。

4

4 に答える 4

2

HTML属性に関しては、ネット上に複数の正規表現の例があります。2つの特定のケース、および他のほぼすべてのimage-srcで機能するはずの1つは、次のようになります。

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

この特定の正規表現に関する詳細は、次の場所にあります。HTMLタグから属性を取得するための正規表現

'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";

属性の順序がであり、img-tagと正しいクラス「thumb」の両方が見つかった場合にのみ一致します。どうぞ:{class, src}

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

3つのimgエントリのうち2つだけが一致します(テストセットに3番目の間違ったリンクを含めました)。

よろしく

rbo

于 2012-07-11T20:30:52.967 に答える
0

が必要な場合はsrc、正規表現の他のすべてを無視する必要があります。

試す:

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

あなたの正規表現として。

于 2012-07-11T20:10:15.847 に答える
0

xml/htmlの解析に正規表現を使用することはお勧めしません。この質問が表示されるはずです:正規表現は、 XHTML自己完結型タグを除くオープンタグと一致します

あなたができることは、URLを理解するために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 に答える