我不是 DOMDocument 的粉丝,因为我相信它对于现实世界的使用不是很好。然而在当前项目中,我需要用其他字符串(某种翻译)替换页面中的所有文本(我无权访问源代码);所以我需要使用它。
我尝试使用 DOMDocument 执行此操作,但没有收到预期的结果。这是我使用的代码:
function Translate_DoHTML($body, $replaceArray){
if ($replaceArray && is_array($replaceArray) && count($replaceArray) > 0){
$body2 = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
$doc = new DOMDocument();
$doc->resolveExternals = false;
$doc->substituteEntities = false;
$doc->strictErrorChecking = false;
if (@$doc->loadHTML($body2)){
Translate_DoHTML_Process($doc, $replaceArray);
$body = $doc->saveHTML();
}
}
return $body;
}
function Translate_DoHTML_Process($node, $replaceRules){
if($node->hasChildNodes()) {
$nodes = array();
foreach ($node->childNodes as $childNode)
$nodes[] = $childNode;
foreach ($nodes as $childNode)
if ($childNode instanceof DOMText) {
if (trim($childNode->wholeText)){
$text = str_ireplace(array_keys($replaceRules), array_values($replaceRules), $childNode->wholeText);
$node->replaceChild(new DOMText($text),$childNode);
}
}else
Translate_DoHTML_Process($childNode, $replaceRules);
}
}
以下是问题:
- 转义属性:文件中有 data-X 属性被转义。这不是一个主要问题,但如果我可以禁用此行为会很棒。
在 DOM 之前:
data-link-content=" <a class="submenuitem" href="
DOM之后:
data-link-content=' <a class="submenuitem" href="
- 删除 javascript 中的结束标签:这实际上是我的主要问题。我不知道出于什么原因 DOMDocument 可能会认为需要删除这些标签。但确实如此。正如您在下面的示例中清楚地看到的那样,它删除了 java-script 字符串中的结束标记。它还删除了脚本的最后一部分。似乎 DOMDocument 解析了里面的 java 脚本。也许是因为没有 CDATA 标签?但无论如何它都是 HTML,我们不需要 HTML 中的 CDDATA。我认为 CDATA 是用于 xHTML 的。我也无法在这里添加 CDDATA 。那么我可以要求它不解析脚本标签吗?
在 DOM 之前:
<script type="text/javascript"> document.write('<video src="http://x.webm"><p>You will need to <a href="http://www.adobe.com/go/getflashplayer" target="_blank">Install</a> the latest Flash plugin to view this page properly.</p></video>'); </script>
DOM之后:
<script type="text/javascript"> document.write('<video src="http://x.webm"><p>You will need to <a href="http://www.adobe.com/go/getflashplayer" target="_blank">Install the latest Flash plugin to view this page properly.</script>
如果我无法阻止这些事情,有什么方法可以将此代码移植到 SimpleHTMLDOM?
非常感谢你。