【问题标题】:PHP preg_match - matching html elementsPHP preg_match - 匹配 html 元素
【发布时间】:2013-05-27 21:56:04
【问题描述】:

好的,所以我有一个正则表达式,我正在尝试使用它来匹配某些 html 文件中的特定模式。这是 preg_match 语句:

preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*>[\s\S]*</'.$htmlElementType.'(>)@i', $htmlString, $newMatches, PREG_OFFSET_CAPTURE)

需要明确的是,这是试图匹配 id 为 {{ALViewElement_.*}} 的 html 元素,但它还需要以结束标记结束自身,例如,如果 $htmlElementType 是“section”,它将结束在“/section>”中。

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

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

问题是当我们在 html 后面有一个 section 元素时,它也有一个结束 /section>。示例:

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

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

在这种情况下,完整的马赫就是上面的一切。但我希望它停止在打开我的第一个。这很重要,因为稍后在我的代码中,我需要该结束标记中最后一个 > 的位置。

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

感谢您的帮助!

【问题讨论】:

  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php

标签: php html regex html-parsing preg-match


【解决方案1】:

是的,只需使用一个不贪婪的量词:

preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*?>[\s\S]*?</'.$htmlElementType.'(>)@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);

【讨论】:

  • 太棒了。甚至不知道有这样的东西存在。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2022-01-09
相关资源
最近更新 更多