为了账号安全,请及时绑定邮箱和手机立即绑定

使用DOMXPath清理不赞成使用的HTML代码(将嵌套的<div>标记转换为<p>标记)

使用DOMXPath清理不赞成使用的HTML代码(将嵌套的<div>标记转换为<p>标记)

PHP
牧羊人nacy 2021-05-05 17:50:07
我正在尝试将存储在旧的MS Access数据库中的RTF文本读取到新的PHP Web应用程序中。清理后的数据将使用CKEditor显示给用户,这对于解析符合标准的HTML代码非常严格。但是,存储在MS Access中的数据通常格式不正确或使用不推荐使用的HTML代码。以下是我要清理的示例数据:<div align="right">Previous claim $ &nbsp;&nbsp;935.00<div align="right">&nbsp;&nbsp;This claim $1,572.50</div></div>该数据本来是两行右对齐的文本,但是MS Access使用了不建议使用的align属性来设置<div>标记的样式,而不是style属性,并且在这种情况下当它们应该是顺序的时,它们将嵌套不正确。要将示例数据转换为两行均右对齐且CKEditor将按预期读取和显示的文本行(即文本显示为右对齐),我试图<div>用<p>标签替换标签,并插入内联样式属性用正确的text-align替换不推荐使用的align属性。我正在使用PHP的DOMXPath通过以下代码清理数据:$dom = new DOMDocument();$dom->loadHTML($dataForCleaning, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);$xpath = new DOMXPath($dom);foreach ($xpath->query('//div[@align]') as $node) {    $alignment = $node->getAttribute('align');    $newNode = $dom->createElement('p');    $newNode->setAttribute("style", "text-align:".$alignment);    $node->parentNode->insertBefore($newNode, $node);    foreach ($node->childNodes as $child) {        $newNode->appendChild($child);    }    $node->parentNode->removeChild($node);}我用来insertBefore代替appendChild尝试使元素序列保持相同,但这是导致此嵌套数据示例中的问题的原因。对于非嵌套<div>标签作为要清除的输入数据,已清理的输出html是正确的。但是,在此嵌套<div>示例中,输出最终为:<p style="text-align:right">Previous claim $ &nbsp;&nbsp;935.00</p>请注意,文本的第二行(This Claim ...)已被删除,因为它是<div>作为父级的子级嵌套的<div>我不介意结果<p>标签是否仍然嵌套,因为CKEditor最终清理了这些标签,但是我需要确保我不会像当前代码那样丢失数据。在此先感谢您的帮助和指导。-标记
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信