【问题标题】:Extract Content of a Div with PHP and Regex使用 PHP 和 Regex 提取 div 的内容
【发布时间】:2021-05-11 06:43:05
【问题描述】:

我正在尝试使用 PHP 提取 div 的内容,独立于类名和其他参数。

我需要的是,我有多行、单行、多参数的div比如


<div class="my-class additional-class"><div class="my-class2">
<div class="my-class"></div>
</div>

</div>

我想得到第一个 div 的所有内容,没有第一个 div。

<div class="my-class2">
<div class="my-class"></div>
</div>

通常,我猜

<div.*>(.*)<\/div>/mU

应该有效,但我不确定为什么无效。

我遇到过this one

(?s)(?<=<div\sclass="test">\n).*(?=<\/div>)

它适用于类名test,但我无法使其工作

(?s)(?<=<div.*>\n)(.*)(?=<\/div>)

感谢任何帮助。

谢谢,

【问题讨论】:

  • 更好地使用DOM解析器
  • DOM 解析器是我的第二个选择。我认为在这件事上它不会像正则表达式一样好。
  • 你为什么不认为它在这件事上会像正则表达式一样好用呢?考虑到正则表达式通常不足以处理 html 语言?并且考虑到 DOM 解析器 能够做到这一点?
  • DOM 解析器不起作用,在某些情况下需要时间来找出正确的编码。您需要弄清楚mb_detect_encodingmb_convert_encoding。还有一些用户不在他们的服务器上安装 XML。
  • 错误的欺骗,因为这个问题要求仅查找最外层div 的内容,并且没有提供如下答案的答案。

标签: php regex


【解决方案1】:

这是一种使用DOM解析器获取它的方法:

<?php
$html = '<div class="my-class additional-class"><div class="my-class2">
<div class="my-class"></div>
</div>
</div>';

$doc = new DOMDocument();
$doc->loadHTML($html); // loads your html
$elems = $doc->getElementsByTagName('div'); // find all div elements
$outerdiv = $elems->item(0); // outermost div
echo $outerdiv->childNodes[0]->C14N() . "\n"; // print inner HTML

/*
<div class="my-class2">
<div class="my-class"></div>
</div>
*/
?>

如果您真的想要正则表达式解决方案,请使用:

~<div[^>]*>(.*)</div>~is

并抓住捕获组 #1。

【讨论】:

  • 是的,这正是我想要的。我不知道为什么我想不到这个:) 谢谢
【解决方案2】:

您应该使用[\s\S]* 而不是.* 来匹配每个字符,包括换行符。

这是一个工作示例:

<div.*?>([\s\S]*)<\/div>

test case


另外,如果您希望标签必须平衡,您可以尝试使用递归(?R)

<div.*?>((?:(?!<\/?div)[\s\S]|(?R))*)<\/div>

查看test case,注意它与最后一个&lt;/div&gt; 不匹配,因为它没有相应的开始标签。

【讨论】:

  • 哇,我不知道?R,谢谢。这很好用:)
【解决方案3】:

也许你应该使用非贪婪的解决方案:

<div.*?>(.*)</div>

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多