2012-01-25 87 views
0

我正在使用以下preg_match来获取网页的[title]标记。preg_match中的preg_match

// get <title> 
$search = "/\<title\>(.*)\<\/title>/i"; 
preg_match($search, $url_contents, $result); 
$title = $result[1]; 

现在我想的是[标题]标签内的搜索,所以我写了这个:

// search for $keyword 
$keyword_slash = "/". $keyword ."/"; 
preg_match_all($keyword_slash, $title, $result); 
print_r($result); // just for testing 

我添加$ keyword_slash因为否则它给了我一个错误。然而,这不起作用。它总是返回一个空数组,即使我知道$关键字在[title]中。

+1

是什么在'$ keyword'?做一个'echo $ keyword_slash;'并更新你的问题。 –

+3

如果包含任何元字符,您可能还需要[preg_quote()](http://php.net/preg_quote)'$ keyword'。另外,将大小写不敏感的'i'修饰符添加到该正则表达式中,这样,对于关键字而言情况无关紧要。 – drew010

回答

3

你的正则表达式第一个preg_match似乎不正确。它应该是:

$search = "~<title>([^<]*)</title>~i"; 

但是我必须提醒你,使用正则表达式这样提取的标题是非常容易出错,你应该考虑使用DOM解析器来获取。

更新:这里是建议DOM解析出一个网页的标题:

$dom = new DOMDocument(); 
libxml_use_internal_errors(true); 
$dom->loadHTML($content); 
$xpath = new DOMXPath($dom); 
$title = $xpath->query("//head/title")->item(0)->nodeValue; 
printf("title=[%s]\n", $title); 
+0

用'[^ ​​<]'替换'。*?'。它效率更高。 –

+0

第一个作品,但我会认为你的作品更有效(后来我会google的!)。但是,更新它仍然会给出一个空白数组。 Array([0] => Array()) – Linkjuice57

+0

谢谢@JosephSilber更新了正则表达式。 – anubhava