2016-09-07 5 views
0

は私がすべてのURLのタグで「」Webページからを取得しようと期待していない働いは、URLのは、すべてのタグ「」ウェブページから(PHP)で取得する方法は?私のコードは

例えば

$text = file_get_contents ('http://stackoverflow.com/'); 
$preg = '/<a.+?href=(http:\/\/\w+?\..+?).*?>.+?<\/a>/'; 
preg_match_all($preg,$text,$result); 
echo '<pre>'; 
    print_r($result['1']); 
echo '</pre>'; 

はその後、私は転送プロトコルが多分HTTPまたはHTTPS、私は正規表現を変えたのhref =多分「...」や「...」、そうは

'/<a.+?href=[\'"](http:\/\/\w+?\..+?)[\'"].*?>.+?<\/a>/'; 

に正規表現を変更すると思います

'/<a.+?href=[\'"](https?:\/\/\w+?\..+?)[\'"].*?>.+?<\/a>/'; 

しかし、それはまだ期待どおりに動作しませんでした。

答えて

0

答えは、正規表現でHTMLを解析しようとするのをやめ、便利なDOM API in PHPのようにXMLパーサーを使用する方法を学ぶことです。

$html = <<<'HTML' 
<a href="http://foobar.baz/firstlink">first link here</a> 
<a href='https://www.foobar.quix/secondlink'>second link here</a> 
<a href='//www.foobar.quix/thirdlink'>thirdlink here</a> 
<a href=/fourthlink>fourthlink here</a> 
HTML; 
$dom = new DOMDocument; 
$dom->loadHTML($html); 
$nodes = $dom->getElementsByTagName("a"); 

foreach($nodes as $node) { 
    echo $dom->saveHTML($node), "\n"; 
} 

出力リレー

 
<a href="http://foobar.baz/firstlink">first link here</a> 
<a href="https://www.foobar.quix/secondlink">second link here</a> 
<a href="//www.foobar.quix/thirdlink">thirdlink here</a> 
<a href="/fourthlink">fourthlink here</a> 

は今アンカータグまたはどのようにそれを配合年代に何があるか、それを問題ではありません。一重引用符、二重引用符、引用符がないかどうか、またはhttpまたはhttpsで始まるかどうかなど、場合によってはループ内からいつでものhref属性値に簡単にアクセスできます。

foreach($nodes as $node) { 
    echo $node->getAttribute("href"), "\n"; 
} 

出力

 
http://foobar.baz/firstlink 
https://www.foobar.quix/secondlink 
//www.foobar.quix/thirdlink 
/fourthlink 
関連する問題