【问题标题】:PHP splitting a string of html into an array with class name of tag as keyPHP将一个html字符串拆分为一个数组,其中标签的类名作为键
【发布时间】:2011-08-13 22:06:53
【问题描述】:

我需要获取一串html文本,例如:

<p>This is a line with no spans<br>
This is a line <span class="second">This is secondary</span><br>  
This is another line <span class="third">And this is third</span> <span class="four">this is four</span></p>

并让它在 PHP 中作为一个数组结束,例如:

array(
    "This is a line with no spans",
    array(
      "This is a line",
      second => "This is secondary",
    ),
    array(
      "This is another line",
      third => "And this is third",
      four => "this is four"
    )
);

让每一行变成它自己的值很容易,我只是在
上分割文本,效果很好,但是用类名分割行我不太明白。我觉得 php 的 preg_split 可能是关键,但我对正则表达式有点烂,我无法弄清楚。

有什么想法吗?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您不应尝试使用正则表达式或其他方式解析 HTML。它非常复杂,最终会出现严重的维护问题。

    我强烈建议您研究如何将一大块标记读入 DOM 文档 [docs],然后像浏览器端一样使用 DOM 方法来处理它。

    【讨论】:

    • 我一直在使用 DomDocument 来获取 p 标签,但我想不出一种方法让它在换行符处拆分而不变成文本。跨度>
    • 我不会在换行符处拆分。遍历节点,检查它们的类型和名称(我有文本节点吗?我有 BR 元素吗?),然后根据这些信息做出决定。
    • 我可以发誓我已经尝试过了,但它没有用,但这次它成功了。谢谢大佬!
    【解决方案2】:

    使用正则表达式解析 HTML (cite) 不是一个好主意。这不是一个合适的工具;见@JAAulde's answer

    最好的方法是完全使用 DOM。循环遍历所有子节点(包括文本节点)以按照您想要的方式格式化数组。像这样:

    $p = // get paragraph tag...
    $lines = array();
    $pChildren = $p->childNodes;
    for ($i = 0; $i < $pChildren->length; $i++) {
        $line = array();
        $child = $pChildren->item($i);
        if ($child instanceof DOMText) {
            $line[] = $child->wholeText;
        } elseif ($child instanceof DOMElement) {
            if (strtolower($child->tagName) == 'br') {
                $lines[] = $line;
                $line = array();
            } elseif (strtolower($child->tagName) == 'span' && $child->hasAttribute('class')) {
                $line[$child->getAttribute('class')] = $child->nodeValue;
            }
        }
    }
    

    警告:将以上内容视为伪代码,完全未经测试,仅凭经验和手册。

    【讨论】:

    • 我刚写完,回来看到你的答案。几乎一模一样。
    • 对于后来提出相同问题的人,我确实质疑这是正确的答案。然而,重要的是要指出,从 OP 的内容到被接受为答案的缺失步骤是将标记读入 PHP DOM 文档。有关该文档的链接,请参阅我的答案。
    • @JAAulde:很好,我会提到这一点并参考你的答案。
    【解决方案3】:

    也许您可以使用 XML 解析器? Here是文档。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2021-06-27
      • 1970-01-01
      相关资源
      最近更新 更多