【发布时间】:2017-05-04 14:48:03
【问题描述】:
伙计们,我正在尝试解析一个 HTML 字符串并在任何 p 标记周围添加一个 CDATA 标记,因此 <p>something</p> 最终将成为 <p><!CDATA[<p>blah</p>]]</p>。这就是我想要的:
$html_str = '<p><strong>blah blah blah</strong></p><ul><li>blah blah blah</li><li>blah blah blah</li><li>blah blah blah</li></ul><p>blah blah blah</p>';
$domdoc = new DOMDocument();
$domdoc->loadHTML($html_str);
foreach( $domdoc->getElementsByTagName("p") as $pnode ) {
$cdata = $domdoc->createCDATASection('<p>'. $pnode->nodeValue .'</p>');
$pnode->replaceChild($cdata, $pnode->childNodes->item(0));
}
echo $domdoc->saveXML();
问题是字符串中有一些ul 标签不在p 标签内,我需要对它们做同样的事情;它们需要被CDATA 包围在p 标签内,例如<p><!CDATA[<ul>blah</ul>]]</p>。
我希望我可以先遍历字符串并在任何 ul 前面添加一个 p 标签,然后在第二遍使用上述相同的标签来获得所有 p 标签在CDATA 中,例如:
$html_str = '<p><strong>blah blah blah</strong></p><ul><li>blah blah blah</li><li>blah blah blah</li><li>blah blah blah</li></ul><p>blah blah blah</p>';
$domdoc = new DOMDocument();
$domdoc->loadHTML($html_str);
foreach( $domdoc->getElementsByTagName("ul") as $ulnode ) {
$cdata = $domdoc->createElement("p",$ulnode->nodeValue);
$domdoc->replaceChild($cdata,$ulnode);
}
foreach( $domdoc->getElementsByTagName("p") as $pnode ) {
$cdata = $domdoc->createCDATASection('<p>'. $pnode->nodeValue .'</p>');
$pnode->replaceChild($cdata, $pnode->childNodes->item(0));
}
echo $domdoc->saveXML();
显然这不起作用,我最终只得到了li 项目的内容。我可以不这样做 2 通行证还是因为 ul 是有孩子的父母或其他什么?
我想要结束的是:
<p><!CDATA[<p><strong>blah blah blah</strong></p>]]></p>
<p><!CDATA[<ul><li>blah blah blah</li><li>blah blah blah</li><li>blah blah blah</li></ul>]]></p>
<p><!CDATA[<p>blah blah blah</p>]]></p>
【问题讨论】:
-
我对 CDATA 标签不太熟悉,但在我看来,您的右括号太多了 (
])。 -
你的意思是你可能在
p中有一些ul标签?
标签: php html domdocument