Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何预配父div?_Php_Regex_Preg Match - Fatal编程技术网

Php 如何预配父div?

Php 如何预配父div?,php,regex,preg-match,Php,Regex,Preg Match,我需要使用preg\u match获取div class=“parent”的所有内容 <div class = "parent"> <div id = "child1"> </div> <div id = "child2"> </div> </div> 有人吗?正确的方法是使用并针对您试图提取的特定元素和属性。然而,由于这是家庭作业,让我们来教育你的老师 考虑到精确的字符串,这个正

我需要使用preg\u match获取div class=“parent”的所有内容

<div class = "parent">

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

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

</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到贪婪注释的所有内容。虽然可以通过添加问号(
+?
)使其不贪婪,但它将匹配第一个可能的next子句,而不是最后一个可能的next子句。这意味着它将匹配从div.parent到非贪婪注释的所有内容

由于嵌套问题,正则表达式是解析HTML的非常糟糕的工具。我在这里向你展示的问题我在这里向你展示的我在这里向你展示的问题在这里只触及了你这里的表面,我在这里向你展示的我这里向你展示的问题在这里这里只触及了我这里这里只触及到你这里的表面,我这里只触到了我这里这里的表面,我这里这里这里只触及了我这里这里的表面,我这里这里只触及了我这里这里这里这里的表面,我这里这里这里只触及到我这里这里这里这里这里这里这里只触到你这里的表面,我这里我这里这里这里只只触及到你这里这里这里这里这里我这里我这里只触到你这里这里的表面,我这里我这里我这里我这里只触及到你这里这里这里我这里我这里我这里这里只触及到你这里这里这里这里这里只触到你这里只只触及到你这里的表面的表面,我这里只只只触到我这里这里这里这里的表面的表面,我这里只触到你这里我这里我这里我这里我这里我这里我这里我这里这里等待着你的是什么


如果可能的话,请使用真正的HTML/XML解析器并处理生成的DOM。这将保存您的理智。

出于您的目的,这可能会做到,尽管这并非没有问题(如链接中所述):

preg_match('/(.*)/s',$input,$matches);

在此之后,$matches[0]将包含匹配的文本(包括父div),而$matches[1]将仅包含内部项。

您最终会遇到类似这样的野蛮情况:

/<div[^>]+class ?= ?"parent"[^>]*>(\s*(?:<div.*<\/div>\s*)*)<\/div>/Us
/<div[^>]+class ?= ?"parent"[^>]*>(\s*(<div.*(?2).*<\/div>\s*)*)<\/div>/Us
/]+class?=?“parent”[^>]*>(\s*(?:])是一个字符组,指定除“>”字符以外的任何字符。然后允许在“=”(或非“=”)周围使用空格

然后,基本思想是将每个后续的开始div标记与其结束匹配配对,以便能够在正确的位置停止。这是通过一个可以重复0次或更多次的非捕获子模式完成的。请注意,这只适用于一个嵌套级别。要处理这个问题,需要递归,并且很难概念化

递归版本将如下所示:

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

/]+class?=?“parent”[^>]*>(\s*(另一个试图用正则表达式解析HTML的人……请看#1的答案:这实际上是我的导师给出的一个练习。我们正在使用正则表达式atm.+1解释
修饰符。这是我最近几次遇到的问题,我忘记了如何解决它!