2016-09-07 32 views
0

我试图获得“A”从网页中的广告代码的URL的如何获得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>'; 

后,我认为在href =也许“...”或“...”,所以更改正则表达式

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

我找到了传输协议也许HTTP或HTTPS,我改变了对正则表达式

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

但它仍然没有像预期的那样工作。

回答

0

答案是停止尝试使用正则表达式解析HTML,并学习如何使用XML解析器,如方便的DOM API in PHP

$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> 

现在没关系在锚标记是什么,或者它如何制定。无论是单引号还是双引号,或者根本没有引号,或者是以httphttps开头还是任何情况。您可以在该循环内轻松地从$node->getAttribute('href')获得href属性值。

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

输出

 
http://foobar.baz/firstlink 
https://www.foobar.quix/secondlink 
//www.foobar.quix/thirdlink 
/fourthlink