所以我有代码
function getTagContent($string, $tagname) {
$pattern = "/<$tagname.*?>(.*)<\/$tagname>/";
preg_match($pattern, $string, $matches);
print_r($matches);
}
然后我打电话
$url = "http://www.freakonomics.com/2008/09/24/wall-street-jokes-please/";
$html = file_get_contents($url);
getTagContent($html,"title");
然后它显示没有匹配,而如果你打开网址的来源,那里显然有一个标题标签....
我做错了什么?
答案 0 :(得分:2)
尝试DOM
$url = "http://www.freakonomics.com/2008/09/24/wall-street-jokes-please/";
$doc = new DOMDocument();
$dom = $doc->loadHTMLFile($url);
$items = $doc->getElementsByTagName('title');
for ($i = 0; $i < $items->length; $i++)
{
echo $items->item($i)->nodeValue . "\n";
}
答案 1 :(得分:0)
'title'标记与其结束标记不在同一行,因此你的preg_match找不到它。
在Perl中,你可以添加一个/ s开关,使其像一行一样啜饮整个输入:我忘记了preg_match是否会让你这样做。
但这只是使用regexp解析XML和变体的一个原因之一。
答案 2 :(得分:0)
可能是因为标题分布在多行上。您需要添加选项s
,以便点也匹配任何行返回。
$pattern = "/<$tagname.*?>(.*)<\/$tagname>/s";
答案 3 :(得分:0)
让你的php函数getTagContent
像这样:
function getTagContent($string, $tagname) {
$pattern = '/<'.$tagname.'[^>]*>(.*?)<\/'.$tagname.'>/is';
preg_match($pattern, $string, $matches);
print_r($matches);
}
重要使用非贪婪匹配所有.*?
来匹配标记的开头和结尾之间的文本,同样重要的是使用标记s
进行DOTALL(匹配)新行以及i
用于忽略大小写比较。