2012-08-07 84 views
0

试图找到所有HTML <表>行与该运营商在PHP所有的HTML表行,但没有:查找与正则表达式

preg_match_all("#<tr[^>]*>.*</tr>#", $content, $matches); 

有什么不对?

+1

[小马他来...](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – 2012-08-07 13:50:26

+0

[The小马他来...](http://stackoverflow.com/a/1732454/1338999)不要使用正则表达式来描述HTML! – Matt 2012-08-07 13:50:47

+0

我真的不知道我们是否应该能够用罐装'HTML/Regexp'原因来解决问题 – 2012-08-07 13:51:19

回答

3

除非进入复杂的递归表达式,否则任何正则表达式都会遇到嵌套表的问题。

试试这个:

$dom = new DOMDocument(); 
$dom->loadHTML($content); 
$matches = $dom->getElementsByTagName("tr"); 
$count = $matches->length; 
+0

如果我想在之后查看标签之间的HTML,该怎么办? – 2012-08-07 14:02:28

+0

由于'$ matches'是一个DOMNodeList,每个节点都有一个属性'childNodes',它是子节点的另一个DOMNodeList。 – DavidS 2012-08-08 06:10:11

+0

@Kolink嗯,我可能会遇到当我必须解析无效的HTML DOMDocument解析失败。 – ravisoni 2013-08-30 07:03:49

3

我想你会在PHP HTML parser上获得更多的成功。

+0

使用https://code.google.com/p/ganon/(Ganon)糊状物更快,更好。 – ravisoni 2013-08-30 07:04:49

4
preg_match_all ('#<tr[^>]*>(.*?)</tr>#s') 

增加的“S”标志,这样它也匹配换行符,问号匹配(懒惰),并且还添加了括号(捕捉组)。