You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP DOMDocument改进:遍历HTML字符串中所有含文本元素

解决方案:遍历HTML中所有含文本的元素进行翻译

你原来的代码仅处理<p>标签,要实现遍历所有含文本的元素,需要调整遍历逻辑,同时注意保留原元素的属性(避免直接替换整个元素导致属性丢失),以下是优化后的完整代码:

$htmlString = 
    '&lt;section&gt;
    &lt;h2&gt;Ámbito de aplicación&lt;/h2&gt;
    &lt;p&gt;
        Estas condiciones generales constituyen las condiciones de uso
        junto con las normas comunitarias, disponibles en
        http://add.com/community-rules y las posibles condiciones
        complementarias pactadas entre el usuario!.
    &lt;/p&gt;
&lt;/section&gt;';

$dom = new \DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($htmlString);

// 遍历所有HTML元素
foreach ($dom->getElementsByTagName('*') as $element) {
    // 排除不需要翻译的标签(比如脚本、样式、元信息类标签)
    $excludeTags = ['script', 'style', 'meta', 'link', 'title', 'noscript'];
    if (in_array(strtolower($element->tagName), $excludeTags)) {
        continue;
    }

    // 收集当前元素下的直接文本节点(跳过子元素的文本,避免重复翻译)
    $textNodes = [];
    foreach ($element->childNodes as $child) {
        // 筛选非空的文本节点
        if ($child->nodeType === XML_TEXT_NODE && trim($child->nodeValue) !== '') {
            $textNodes[] = $child;
        }
    }

    // 对每个文本节点进行翻译并替换
    foreach ($textNodes as $textNode) {
        $originalText = trim($textNode->nodeValue);
        $translatedText = $this->translate($originalText);
        // 创建新的文本节点替换原有节点,保留元素结构和属性
        $newTextNode = $dom->createTextNode($translatedText);
        $textNode->parentNode->replaceChild($newTextNode, $textNode);
    }
}

$translatedHtml = $dom->saveHTML();

关键改进点说明:

  • 遍历所有元素:使用getElementsByTagName('*')获取HTML中所有元素,不再局限于<p>标签
  • 排除无关标签:跳过脚本、样式等不需要翻译的标签,避免无效处理
  • 保留元素属性:不再直接替换整个元素,而是仅替换元素内的文本节点,确保原元素的class、href等属性不会丢失
  • 精准处理文本:只处理元素的直接文本节点,避免重复翻译子元素中的文本内容

内容的提问来源于stack exchange,提问作者gabogabans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:55:36