我正在尝试将存储在旧的MS Access数据库中的RTF文本读取到新的PHP Web应用程序中。清理后的数据将使用CKEditor显示给用户,这对于解析符合标准的HTML代码非常严格。但是,存储在MS Access中的数据通常格式不正确或使用不推荐使用的HTML代码。
以下是我要清理的示例数据:
<div align="right">Previous claim $ 935.00<div align="right"> 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 $ 935.00</p>
请注意,文本的第二行(This Claim ...)已被删除,因为它是<div>作为父级的子级嵌套的<div>
我不介意结果<p>标签是否仍然嵌套,因为CKEditor最终清理了这些标签,但是我需要确保我不会像当前代码那样丢失数据。
在此先感谢您的帮助和指导。-标记