Php simplexml\u导入\u dom在最后一个节点后丢失文本
我有来自WYSIWYG编辑器的HTML,所以我无法控制它附带的HTML。我需要解析以创建PDF 我创建一个DomDocument并加载HTML并将其传递给simpleXML,因为它更易于处理。 但我时不时地会释放文本,因为它设置在最后一个HTML元素之后Php simplexml\u导入\u dom在最后一个节点后丢失文本,php,simplexml,domdocument,Php,Simplexml,Domdocument,我有来自WYSIWYG编辑器的HTML,所以我无法控制它附带的HTML。我需要解析以创建PDF 我创建一个DomDocument并加载HTML并将其传递给simpleXML,因为它更易于处理。 但我时不时地会释放文本,因为它设置在最后一个HTML元素之后 // text to import $text = "Text beginnning<strong>Lorem ipsum dolor sit amet, consetetur</strong> Lore
// text to import
$text = "Text beginnning<strong>Lorem ipsum dolor sit amet, consetetur</strong>
Lorem ipsum dolor sit amet, consetetur.<br \/><br \/><strong>Lorem ipsum
dolor sit amet, consetetur</strong><ul><li>Lorem ipsum dolor sit amet, consetetur
<\/li><li>Lorem ipsum dolor sit amet, consetetur<\/li><li>Lorem ipsum
dolor sit amet, consetetur<\/li><li>Lorem ipsum dolor sit amet, consetetur
<\/li><\/ul>Text after last node";
// Load text in dom and pass it to simplexml
$dom = new DOMDocument();
$dom->loadHTML($text);
$dom->recover = true;
if ($dom) {
$sxml = simplexml_import_dom($dom);
unset($dom);
if ($sxml) {
$this->parseHtmlContent($sxml->children());
}
}
//要导入的文本
$text=“text beginningLorem ipsum door sit amet,consetetur
同侧盲盲蝽(Lorem ipsum dolor sit amet,consetetur.
同侧盲蝽
多尔塞特,康塞特- Lorem ipsum多尔塞特,康塞特
- 同侧眼珠,同侧眼珠
- 同侧眼珠
多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着
最后一个节点后的文本”;
//在dom中加载文本并将其传递给simplexml
$dom=新的DOMDocument();
$dom->loadHTML($text);
$dom->recover=true;
如果($dom){
$sxml=simplexml\u import\u dom($dom);
unset($dom);
如果($sxml){
$this->parseHtmlContent($sxml->children());
}
}
所以“最后一个节点后的文本”在途中丢失了,我不知道该怎么办
如何防止这种情况发生?最后一个节点后的文本与该节点处于同一级别。结构如下:
object(SimpleXMLElement)#2 (1) {
["body"]=>
object(SimpleXMLElement)#3 (2) {
["p"]=>
string(63) "Text beginnning
Lorem ipsum dolor sit amet, consetetur."
["ul"]=>
object(SimpleXMLElement)#4 (1) {
["li"]=>
array(4) {
[0]=>
string(47) "Lorem ipsum dolor sit amet, consetetur
"
[1]=>
string(38) "Lorem ipsum dolor sit amet, consetetur"
[2]=>
string(46) "Lorem ipsum
dolor sit amet, consetetur"
[3]=>
string(47) "Lorem ipsum dolor sit amet, consetetur
"
}
}
}
}
因此body节点包含其他节点和一个字符串。要获取body节点下的字符串,您必须调用\uuuuToString
方法:
$text = "Text beginnning<strong>Lorem ipsum dolor sit amet, consetetur</strong>
Lorem ipsum dolor sit amet, consetetur.<br \/><br \/><strong>Lorem ipsum
dolor sit amet, consetetur</strong><ul><li>Lorem ipsum dolor sit amet, consetetur
<\/li><li>Lorem ipsum dolor sit amet, consetetur<\/li><li>Lorem ipsum
dolor sit amet, consetetur<\/li><li>Lorem ipsum dolor sit amet, consetetur
<\/li><\/ul>Text after last node";
$text = stripcslashes($text);
// Load text in dom and pass it to simplexml
$dom = new DOMDocument();
$dom->loadHTML($text);
$dom->recover = true;
if ($dom) {
$sxml = simplexml_import_dom($dom);
unset($dom);
if ($sxml) {
var_dump((string) $sxml->body);
}
}
$text=“text beginningLorem ipsum door sit amet,consetetur
同侧盲盲蝽(Lorem ipsum dolor sit amet,consetetur.
同侧盲蝽
多尔塞特,康塞特- Lorem ipsum多尔塞特,康塞特
- 同侧眼珠,同侧眼珠
- 同侧眼珠
多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着,多尔坐着
最后一个节点后的文本”;
$text=stripcslashes($text);
//在dom中加载文本并将其传递给simplexml
$dom=新的DOMDocument();
$dom->loadHTML($text);
$dom->recover=true;
如果($dom){
$sxml=simplexml\u import\u dom($dom);
unset($dom);
如果($sxml){
变量转储((字符串)$sxml->body);
}
}
有关更多信息,请参阅:
在其
中有一些强调部分的文本 <> < SimpleXML >给出的如果可以保证文档的某些部分将包含特定的HTML结构(例如示例中的
/
序列),则可以使用SimpleXML仅解析该部分。可以使用DOM恢复该
两侧的内容,并将其添加回输出中。请确保将整个内容包装在单个包含元素中:
$dom->loadHTML('<div>' . $text . '</div>');
$dom->loadHTML('.$text'');
为什么不能按原样使用DOMDocument?SimpleXML不用于处理HTML。您可以使用$dom->textContent
仅从中提取文本HTML@silkfire因为其他人在this->parseHTMLContent
中构建了整个解析,我必须重写完整的代码。我只是想我可能缺少一个选项,无法将文本作为子节点获取。@spankmaster79如何解析HTML?也许我可以为您想出一个方法。$sxml->asXML()
确实有正确的文本,但是文本并不像$sxml->children()
那样被算作childnode。我来把斜线去掉。