PHP-从HTML提取文本,进行翻译并将其放回原处

时间:2018-12-16 19:04:11

标签: php html-parsing text-parsing

我正在使用API​​来翻译我的博客,但有时它会以某种方式弄乱我的html,从而使我可以进行更多工作来修复所有问题。

我现在想做的是从html中提取内容,将其翻译并放回原处。

我首先尝试使用preg_replace做到这一点,在这里我会用## a_number ##之类的东西替换每个标签,然后在翻译文本后恢复为原始标签。不幸的是,这很难管理,因为我需要用唯一的值替换每个标签。

然后我尝试使用“简单html dom”进行尝试,可以在这里找到它: http://simplehtmldom.sourceforge.net/manual.htm

$html = str_get_html($content);
$str = $html;
$ret = $html->find('div');
foreach ($ret as $key=>$value)
    {  
        echo $value;
    }

这样,我可以获取所有文本,但是值中仍然有一些html(div内的div),我不知道如何将翻译后的文本放回原始对象中。该对象的结构是如此复杂,以至于在显示它时,它会使我的浏览器崩溃。

我的选项用尽了,可能有更简单的方法可以做到这一点。我想找到的是一种获取对象或数组的方法,该对象或数组的一侧包含所有html,另一侧包含所有文本。我将遍历文本以将其翻译并合并回所有内容,以免破坏html。

您看到实现这一目标的更好选择吗?

谢谢 洛朗(Laurent)

2 个答案:

答案 0 :(得分:1)

<div>
   <p>
        This text is for translating<br>
        Next line of text
   </p>
</div>

如果将html字符串分解为在“ <”上分割的数组怎么办,这将导致该数组:

Array
(
[0] => 

[1] => div>

[2] => p>
        This text is for translating
[3] => br>
        Next line of text

[4] => /p>

[5] => /div>

)

然后在“>”上拆分每个数组项。此数组中的第一项是标记。其他所有项目(如果有的话)都会有翻译内容。

翻译完成后,您可以通过再次将阵列项目粘回去来反转它。

答案 1 :(得分:1)

例如,我有以下HTML,其中所有单词均为小写:

<div>
    <h2>page not found!</h2>
    <p>go to <a href="/">home page</a> or use the <a href="/search">search</a>.</p>
</div>

我的任务是将文本转换为大写单词。为了解决这个问题,我获取了所有文本节点,并使用ucwords函数对其进行了转换(当然,您应该使用翻译函数代替它)。

libxml_use_internal_errors(true);
$dom = new DomDocument();
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//text()') as $text) {
    if (trim($text->nodeValue)) {
        $text->nodeValue = ucwords($text->nodeValue);
    }
}

echo $dom->saveHTML();

上面的输出如下:

<div>
    <h2>Page Not Found!</h2>
    <p>Go To <a href="/">Home Page</a> Or Use The <a href="/search">Search</a>.</p>
</div>