Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.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 preg_匹配-匹配html元素_Php_Html_Regex_Html Parsing_Preg Match - Fatal编程技术网

PHP preg_匹配-匹配html元素

PHP preg_匹配-匹配html元素,php,html,regex,html-parsing,preg-match,Php,Html,Regex,Html Parsing,Preg Match,好的,我有一个正则表达式,我试图用它来匹配一些html文件中的特定模式。以下是preg_match声明: preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*>[\s\S]*</'.$htmlElementType.'(>)@i', $htmlString, $newMatches, PREG_OFFSET_CAPTURE) preg_matc

好的,我有一个正则表达式,我试图用它来匹配一些html文件中的特定模式。以下是preg_match声明:

preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*>[\s\S]*</'.$htmlElementType.'(>)@i', $htmlString, $newMatches, PREG_OFFSET_CAPTURE)
preg_match('@[\s\s]*)@i',$htmlString,$newMatches,preg_OFFSET_CAPTURE)
明确地说,这是试图将html元素与id为{{alviewelment_.*}}的html元素相匹配,但它还需要以结束标记结尾,例如,如果$htmlElementType是“section”,它将以“/section>结尾

如果我的html看起来像这样,但没有其他内容,那么它会按预期工作:

<section id="{{ALViewElement_resume}}">
            <!--{{RESUME_ADD_CHANGE_PIECE}}-->
            <!--{{RESUME}}-->
        </section>

问题是当我们在html的后面有一个section元素时,它还有一个closing/section>。例如:

<section id="{{ALViewElement_resume}}">
            <!--{{RESUME_ADD_CHANGE_PIECE}}-->
            <!--{{RESUME}}-->
        </section>
        <div>

        </div>
        <section>
            HEY THIS IS ME
        </section>

嘿,这是我
在这种情况下,全马赫数就是上面的一切。但我想让它停在打开我第一个的地方。这一点很重要,因为稍后在我的代码中,我需要结束标记中最后一个>的位置

有什么办法可以稍微改变一下这个正则表达式吗


谢谢你的帮助

是的,只需使用一个不灵活的量词:

preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*?>[\s\S]*?</'.$htmlElementType.'(>)@i', $htmlString, $newMatches, PREG_OFFSET_CAPTURE)
preg_match('@[\s\s]*?)@i',$htmlString,$newMatches,preg_OFFSET_CAPTURE)
另一种方法:使用DOMDocument:

$html = <<<LOD
<section id="{{ALViewElement_resume}}">
        <!--{{RESUME_ADD_CHANGE_PIECE}}-->
        <!--{{RESUME}}-->
</section>
<div>

</div>
<section>
    HEY THIS IS ME
</section>
LOD;
$doc= new DOMDocument();
@$doc->loadHTML($html);
$node = $doc->getElementById("{{ALViewElement_resume}}");

$docv = new DOMDocument();
$docv->appendChild($docv->importNode($node, TRUE));
$result = $docv->saveHTML();
echo htmlspecialchars($result);

$html=Awesome。我甚至不知道有这样的事情存在。谢谢不要使用正则表达式来解析HTML。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已编写、测试和调试的PHP模块正确解析HTML的示例,请参见。