1

PHP を使用して Web ページをカールします (ユーザーが入力した URL が有効であると仮定します)。例: http://www.youtube.com/watch?v=Hovbx6rvBaA

HTML を解析し、画像のように見えるすべての重複除去された URL を抽出する必要があります。にあるものだけでなく、そのページの などでimg src=""終わるすべての URL 。jpe?g|bmp|gif|png(つまり、DOM を解析したくありませんが、RegEx を使用したいのです)。

次に、幅と高さの情報について URL をカールし、それらが実際に画像であることを確認する予定なので、セキュリティ関連のものについて心配する必要はありません。

4

2 に答える 2

5

DOM を使用することの何が問題になっていますか? これにより、情報のコンテキストをより適切に制御できるようになり、引き出すものが実際に URL である可能性がはるかに高くなります。

<?php
$resultFromCurl = '
    <html>
    <body>
    <img src="hello.jpg" />
    <a href="yep.jpg">Yep</a>
    <table background="yep.jpg">
    </table>
    <p>
        Perhaps you should check out foo.jpg! I promise it 
        is safe for work.
    </p>
    </body>
    </html>
';

// these are all the attributes i could think of that
// can contain URLs.
$queries = array(
    '//table/@background',
    '//img/@src',
    '//input/@src',
    '//a/@href',
    '//area/@href',
    '//img/@longdesc',
);

$dom = @DOMDocument::loadHtml($resultFromCurl);
$xpath = new DOMXPath($dom);

$urls = array();
foreach ($queries as $query) {
    foreach ($xpath->query($query) as $link) {
        if (preg_match('@\.(gif|jpe?g|png)$@', $link->textContent))
            $urls[$link->textContent] = true;
    }
}

if (preg_match_all('@\b[^\s]+\.(?:gif|jpe?g|png)\b@', $dom->textContent, $matches)) {
    foreach ($matches as $m) {
        $urls[$m[0]] = true;
    }
}

$urls = array_keys($urls);
var_dump($urls);
于 2010-08-19T06:09:37.430 に答える
1

すべての画像のURLを配列に収集し、array_unique()を使用して重複を削除します。

$my_image_links = array_unique( $my_image_links );
// No more duplicates

本当に正規表現を使用してこれを実行したい場合は、各画像名が、、、またはスペース、タブ、改行、または行頭、、、などで囲まれていると'想定でき"ます。したがって、次のことができます。><

$pattern = '/[\'" >\t^]([^\'" \n\r\t]+\.(jpe?g|bmp|gif|png))[\'" <\n\r\t]/i';
preg_match_all($pattern, html_entity_decode($resultFromCurl), $matches);
$imgs = array_unique($matches[1]);

上記は、次のような画像リンクをキャプチャします。

<p>Hai guys look at this ==> http://blah.com/lolcats.JPEG</p>

実例

于 2010-08-19T06:07:00.633 に答える