PHP将一串html拆分为一个类名为tag的数组

我需要获取一串html文本,如:</ p>

 &lt; p&gt;这是没有跨度的行&lt; br&gt; 
这是一行&lt; span class =“second”&gt;这是次要&lt; / span&gt;&lt; br&gt;

这是另一条&lt; span class =“third”&gt;这是第三个&lt; / span&gt; &lt; span class =“four”&gt;这是4&lt; / span&gt;&lt; / p&gt;
</ code> </ pre>

让它最终成为PHP中的数组 :</ p>

  array(
“这是一条没有跨度的行”,
数组(
“这是一行”,
second =&gt;“这个 是次要的“,
”,
数组(
“这是另一行”,
third =&gt;“这是第三个”,
four =&gt;“这是四个”

);
</ code> </ pre>

将每行放入其自身的值很简单,我只是将文本拆分为&lt; br&gt; 并且工作正常,但是使用类名称拆分行我无法得到。 我觉得php的 preg_split 可能会保留密钥,但我对正则表达式感到厌烦,我不能 搞定它。</ p>

任何想法?</ p>
</ div>

展开原文

原文

I need to take a string of html text like:

<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>

And have it end up as an array in PHP like:

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"
    )
);

Getting each line into it's own value was easy, I just split the text on <br> and that works fine, but getting lines to be split with the class name I can't quite get. I feel like php's preg_split may hold the key, but I kind of suck with regular expressions and I can't get it figured out.

Any ideas?

3个回答



使用正则表达式解析HTML不是一个好主意(引用)。 它不是一个合适的工具; 请参阅 @ JAAulde的回答。< / p>

最好的方法是使用DOM完全实现。 遍历所有子节点(包括文本节点)以按您希望的方式格式化数组。 像这样:</ p>

  $ p = //获取段落标记... 
$ lines = array();
$ pChildren = $ p-&gt; childNodes; \ nfor($ i = 0; $ i&lt; $ pChildren-&gt; length; $ i ++){
$ line = array();
$ child = $ pChildren-&gt; item($ i);
if ($ child instanceof DOMText){
$ line [] = $ child-&gt; wholeText;
} elseif($ child instanceof DOMElement){
if(strtolower($ child-&gt; tagName)=='br' ){
$ lines [] = $ line;
$ line = array();
} elseif(strtolower($ child-&gt; tagName)=='span'&amp;&amp; $ child-&gt; hasAttribute ('class')){
$ line [$ child-&gt; getAttribute('class')] = $ child-&gt; nodeValue;
}
}
}
</ code> </ pre >

警告:</ strong>将上述视为伪代码,它根本没有经过测试,只是来自经验和手册。</ p>
</ div >

展开原文

原文

It's not a good idea to use regular expressions to parse HTML (cite). It's just not a suitable tool; see @JAAulde's answer.

The best way is to do it purely with the DOM. Loop through all child nodes (including text nodes) to format the array the way you want. Like this:

$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;
        }
    }
}

Warning: treat the above as pseudo-code, it has not been tested at all, just going from experience and the manual.

doutang7661
doutang7661 优点,我会提到这一点,并参考你的答案。
接近 9 年之前 回复
dt3674
dt3674 对于那些后来遇到同样问题的人,我不认为这是正确的答案。 然而,重要的是要指出,从OP的内容到已接受的答案的缺失步骤是将标记读入PHP DOM文档。 请参阅我的答案,获取有关该文档的链接。
接近 9 年之前 回复
douhuan1908
douhuan1908 我刚写完这篇文章然后回来看了你的答案。 几乎相同。
接近 9 年之前 回复



也许你可以使用XML解析器? 此处是文档。</ p>
</ div >

展开原文

原文

Maybe you can use an XML parser ? Here's the doc.



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

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

展开原文

原文

You should not attempt to parse HTML with regex or other means. It is very complicated and will end up with terrible maintenance problems.

I highly recommend you look into how to read a chunk of markup into a DOM document [docs] and then use DOM methods to work with it just like you would browser side.

doushang3352
doushang3352 我本来可以发誓我已经尝试过但它没有用,但是这次做了。 谢啦!
接近 9 年之前 回复
dos3018
dos3018 看到我的回答
接近 9 年之前 回复
dongxieyi9115
dongxieyi9115 我不会分线。 走路节点,检查它们的类型和名称(我有一个文本节点吗?我有一个BR元素吗?),并使用该信息做出决定。
接近 9 年之前 回复
du7999
du7999 我一直在使用DomDocument来获得p标签,但我无法找到一种方法让它在换行符上分开而不会成为文本。
接近 9 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐