2012-11-22 29 views
4

有很多答案对这个问题,但不是一个单一的完整的一个:正则表达式来获得页面的标题

使用一个正则表达式,你怎么提取<title>Page title</title>页面标题?

还有其他一些情况下,标题标签是如何输入,如:

<TITLE>Page title</TITLE> 

<title> 
Page title</title> 
<title> 
Page title 
</title> 

<title lang="en-US">Page title</title> 

...或以上的任意组合。

,它可以在自己的行或在其他标记之间:

<head> 
    <title>Page title</title> 
</head> 

<head><title>Page title</title></head> 

感谢提前的帮助。

UDPATE:所以,正则表达式可能不是最好的解决方案。哪个基于PHP的HTML解析器可以处理所有情况,哪里的HTML格式良好(或者不太好)?

更新2:sp00m的正则表达式(https://stackoverflow.com/a/13510307/1844607)似乎在所有情况下都能正常工作。如有需要,我会回来。

+4

那的原因之一,为什么正则表达式是这个职位的错误的工具。你为什么不使用一个html解析器? – stema

+0

基于PHP的HTML解析器使用的任何想法? – Jari

+0

很好的问题+1对于这个 –

回答

7

Use a HTML parser instead。但在以下情况下:

<title[^>]*>(.*?)</title> 

Demo

+0

变成了PHP'preg_match(“/ *)(。*?)<\/title> /”,$ html,$ title);'没有从http获得标题://www.gameinformer.com/b/features/archive/2012/11/21/the-top-10-grand-theft-auto-characters-of-all-time.aspx – Jari

+1

@Jari使用'i' (不区分大小写),'m'(多行)和's'(点metachar包含新行)标志,即'/ ] *>(。*?)<\/title>/ims'。请参阅[模式修饰符](http://php.net/manual/en/reference.pcre.pattern.modifiers.php)。 – sp00m

+0

这似乎是工作,谢谢!如果我发现一些失败的新场景,我会回头看看。 – Jari

2

使用DOMDocument类:

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$titles = $doc->getElementsByTagName("title"); 
echo $titles->item[0]->nodeValue; 
+0

这种方法可以工作,但它似乎失败的情况下,HTML不像它应该是“验证”的情况下。如:http://www.gameinformer.com/b/features/archive/2012/11/21/the-top-10-grand-theft-auto-characters-of-all-time.aspx – Jari

+0

@Jari那个链接与什么有什么关系?你能否提供一些正则表达式是一种优越的方法,因为html没有被“验证”足够的情况? HTML越不完整,就越容易产生一个正式的正则表达式。 –

+0

这只是很多页面的一个例子,它应该能够从中获取页面标题。如果一个HTML解析器比任何正则表达式都好,它适合我,但真正的问题是:哪一个HTML解析器处理未验证(损坏)的HTML足够好? – Jari

0

使用这个表达式:

<title>[\s\S]*?</title> 
+0

不知道我是否完全正确地使用了PHP preg_match(“/ sdk” ,$ title);',但是这并没有从这里获得页面标题:http://www.gameinformer.com/b/features/archive/2012/11/21/the-top-10-grand-theft -auto-characters-of-all-time.aspx – Jari

+0

使用编辑正则表达式,让我知道它有效吗? – F11