2010-10-15 34 views
0

我工作的正则表达式查找文本的整个堆里面如何使用PHP中的正则表达式解析此HTML?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

坐在那里,说菜单的结束标记......它看起来像这样:

<!--END MENU--> 

这是我编写的代码,但并未将匹配文字吐出:

$value = preg_match('/^<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd\">(.*?)<!--END MENU-->/',$content, $matching_text); 

echo $matching_text[0] 
+0

读http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-标签/ 1732454#1732454。 – Ms2ger 2010-10-16 17:33:56

回答

1

您无法可靠地使用正则表达式解析HTML。改为使用HTML解析器。

2

尽管我通常会同意Andy,但您应该能够在给定具体的开始和结束时解析HTML字符串的这部分。

如果没有m修饰符,.(点)将不匹配换行符。把它扔到你的正则表达式模式的末尾,并给它一个镜头。

more details

1

首先,在你的正则表达式需要某些字符进行转义,例如点。

其次,即使您当前的正则表达式工作,它也不会匹配很多HTML文档,因为您的要求太具体。

在我opninion,你应该使用这个表达式来代替:

/<!doctype\s*html\b[^><]+>(.*?)<!--\s*end\s+menu\s*-->/ism 
+1

+1注意OP的正则表达式的正确性。我仍然认为即使你的需要'm'修饰符。 – 2010-10-15 12:44:56

+0

糟糕,谢谢@Jason为了捕捉那个。 :-) – Vantomex 2010-10-15 13:24:28