2010-07-19 21 views
0

我需要DIV CLASS = “父” 使用的preg_match的所有内容,如何preg_match父div?

<div class = "parent"> 

    <div id = "child1"> 
    </div> 

    <div id = "child2"> 
    </div> 

</div> 

有人吗?

+1

另一个试图用正则表达式解析HTML的人... [呃-oh](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)... – quantumSoup 2010-07-19 03:06:26

+1

看到#1回答:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – 2010-07-19 03:11:36

+0

这实际上是一个练习由我的导师给出。我们正在使用正则表达式atm。 – Karl 2010-07-19 03:27:02

回答

2

正确的做法是使用the DOMxpath来定位您尝试提取的特定元素和属性。然而,因为这是作业,让我们教导你的老师。

鉴于确切字符串,这个正则表达式将工作:!<div class = "parent">(.+)</div>!s

的关键是 “s” 修饰符。它将“.”字符从“除换行符之外的任何内容”变为“包括换行符在内的任何内容”。

但是,如果空间在=附近被移除,则会中断。如果有更多的属性,它会中断。如果有更多的类名,这会中断。换句话说,这是处理HTML 有史以来最差的方法

地狱,如果HTML看起来像这样,它会破坏:

<div> 
    <div class = "parent"> 
     My spoon is too big! 
     <div> 
      I am a banana! 
     </div><!-- Matches when un-greedy --> 
    </div> 
</div><!-- Matches when greedy --> 

为什么?因为.+就是所谓的“贪婪”。它会匹配所有可能的东西,直到下一个条款。这意味着它可以匹配从div.parent到贪婪评论的所有内容。虽然可以通过添加问号(.+?)使其变得非贪婪,但它会匹配第一个可能的下一个子句,而不是最后一个可能的下一个子句。这意味着它可以匹配div.parent和un-greedy评论中的所有内容。

由于嵌套问题,正则表达式是解析HTML的非常糟糕的工具。我在这里向您展示的问题只触及了等待您的hohlsrr̪̖̠̖̤̊̾ͣͦr̪̖̠̖̤̊̾ͣͦo̪̖̠̖̤̊̾ͣͦs̠̏̊͠的表面。

请尽可能使用真正的HTML/XML解析器并使用生成的DOM。它会保存你的理智。

+0

+1用于解释's'修饰符。最近这一直是我的一个问题,我忘记了如何解决它! – 2010-07-19 04:39:35

+0

好的非常感谢。 – Karl 2010-07-19 05:25:39

0

你的目的,这可能会做,但它不是没有问题(如链接说明):

preg_match('/<div class = \'parent\'>(.*)<\/div>/s',$input,$matches); 

后,$比赛[0]将包含匹配的文本(包括父div),$ matches [1]仅包含内部项目。

+0

非常感谢guyz。 – Karl 2010-07-19 06:06:44

0

你最终像这样野蛮:

/<div[^>]+class ?= ?"parent"[^>]*>(\s*(?:<div.*<\/div>\s*)*)<\/div>/Us 

首先,对于希望类的开放div标签内的搜索 - 我喜欢用[^>]这是一个字符组指定任何东西,但“ >“字符。然后允许“=”(或不)的空格。

然后基本的想法是将每个随后打开的div标签与它的封闭配偶配对,以便能够在正确的位置停下来。这是通过一个可以重复0次或更多次的非捕获子模式完成的。注意这只适用于一层嵌套。为了解决这个问题,你需要递归,并且很难概念化。

递归版本将是这个样子:

/<div[^>]+class ?= ?"parent"[^>]*>(\s*(<div.*(?2).*<\/div>\s*)*)<\/div>/Us 

总体来说,如果我不能做到理智的事情,并使用DOM我宁愿通过串行走(从每次开机以前的匹配)为每个打开的div标签递增一个计数器,并为每个结束标签递减。

请注意,这些是我的头顶,为了学习正则表达式而不是用正则表达式解析html的想法是正常的。另外,我不希望看到正则表达式引擎必须通过平衡所有这些通配符的健美操记录。