我正在尝试在特定标签中获取html文档的代码。
我的方法适用于某些标签,但不是全部,并且它不适用于我想要的标签内容。
这是我的代码:
<html>
<head></head>
<body>
<?php
$url = "http://sf.backpage.com/MusicInstruction/";
$data = file_get_contents($url);
$pattern = "/<div class=\"cat\">(.*)<\/div>/";
preg_match_all($pattern, $data, $adsLinks, PREG_SET_ORDER);
var_dump($adsLinks);
foreach ($adsLinks as $i) {
echo "<div class='ads'>".$i[0]."</div>";
}
?>
</body>
</html>
上面的代码不起作用,但是当我将$ pattern更改为:
时,它可以正常工作$pattern = "/<div class=\"date\">(.*)<\/div>/";
或
$pattern = "/<div class=\"sponsorBoxPlusImages\">(.*)<\/div>/";
我看不出这些$ pattern之间有什么不同。请帮我找错。 感谢。
答案 0 :(得分:4)
使用PHP DOM来解析HTML而不是正则表达式。
例如,在您的情况下(代码已更新以显示HTML):
$doc = new DOMDocument();
@$doc->loadHTML(file_get_contents("http://sf.backpage.com/MusicInstruction/"));
$nodes = $doc->getElementsByTagName('div');
for ($i = 0; $i < $nodes->length; $i ++)
{
$x = $nodes->item($i);
if($x->getAttribute('class') == 'cat');
echo htmlspecialchars($x->nodeValue) . "<hr/>"; //this is the element that you want
}
答案 1 :(得分:2)
你的正则表达式失败的原因是你期待的。匹配换行符,除非您使用s modifier,否则不会,所以请尝试
$pattern = "/<div class=\"cat\">(.*)<\/div>/s";
执行此操作时,您可能会发现该模式有点过于贪婪,因为它会尝试捕获到最后一个结束div元素的所有内容。为了使它不贪婪,只是匹配下一个结束div,添加一个?在*
之后$pattern = "/<div class=\"cat\">(.*?)<\/div>/s";
这只是为了说明除了最简单的情况之外,用正则表达式解析HTML是疯狂的道路。因此,请尝试使用DOM functions来解析HTML。