正则表达式帮助在PHP中获取标记内容

时间:2011-06-13 13:43:30

标签: php html regex title

所以我有代码

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");

然后它显示没有匹配,而如果你打开网址的来源,那里显然有一个标题标签....

我做错了什么?

4 个答案:

答案 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用于忽略大小写比较。