PHP提取HTML内容翻译后格式丢失及编码异常问题求助
解决HTML翻译格式丢失与编码异常问题
一、修复HTML格式丢失
直接拆分HTML字符串翻译会导致API破坏标签结构,正确做法是用DOM操作只翻译文本节点,完整保留原HTML标签:
- 使用
DOMDocument和DOMXPath解析HTML,定位目标容器下的所有非空文本节点 - 仅翻译纯文本内容,再将翻译结果放回原节点,完全保留原有HTML结构
示例代码片段:
$htmlContent = file_get_contents('fss4.html'); $dom = new DOMDocument(); // 避免解析时的编码问题和自动添加的html/body标签 $dom->loadHTML('<?xml encoding="UTF-8">' . $htmlContent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $xpath = new DOMXPath($dom); // 提取page-container下的有效文本节点(排除空内容) $textNodes = $xpath->query('//div[@id="page-container"]//text()[normalize-space(.) != ""]'); foreach ($textNodes as $node) { $originalText = trim($node->nodeValue); if (!empty($originalText)) { // 仅翻译文本内容,不触碰标签 $translatedText = $tr->translate($originalText); $node->nodeValue = $translatedText; } } $new_html = $dom->saveHTML();
二、修复法语重音字符编码异常(Ãé显示问题)
这是UTF-8编码处理不严谨导致的乱码,需从文件读写、API返回两个环节优化:
读取文件时强制转为UTF-8:
$htmlContent = file_get_contents('fss4.html'); // 自动检测原文件编码并转成UTF-8 $htmlContent = mb_convert_encoding($htmlContent, 'UTF-8', mb_detect_encoding($htmlContent));写入文件时确保UTF-8编码:
// 直接写入即可,若编辑器识别有问题可添加UTF-8 BOM file_put_contents('fss4_translated.html', $new_html); // 可选:添加BOM兼容部分旧编辑器 // file_put_contents('fss4_translated.html', "\xEF\xBB\xBF" . $new_html);强制翻译API返回UTF-8:
初始化翻译客户端时显式指定编码:$tr = new \Stichoza\GoogleTranslate\GoogleTranslate('en', 'fr'); // 根据需求调整源/目标语言 $tr->setOptions(['encoding' => 'UTF-8']);
完整优化代码
require 'vendor/autoload.php'; use Stichoza\GoogleTranslate\GoogleTranslate; // 初始化翻译客户端 $tr = new GoogleTranslate('en', 'fr'); $tr->setOptions(['encoding' => 'UTF-8']); // 读取并转码HTML文件 $htmlContent = file_get_contents('fss4.html'); $htmlContent = mb_convert_encoding($htmlContent, 'UTF-8', mb_detect_encoding($htmlContent)); // DOM解析与文本翻译 $dom = new DOMDocument(); libxml_use_internal_errors(true); // 忽略HTML解析警告 $dom->loadHTML('<?xml encoding="UTF-8">' . $htmlContent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_clear_errors(); $xpath = new DOMXPath($dom); $textNodes = $xpath->query('//div[@id="page-container"]//text()[normalize-space(.) != ""]'); foreach ($textNodes as $node) { $originalText = trim($node->nodeValue); if (!empty($originalText)) { $node->nodeValue = $tr->translate($originalText); } } // 生成并保存最终HTML $new_html = $dom->saveHTML(); file_put_contents('fss4_translated.html', $new_html);
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

