PHP - 从 HTML 中提取文本,翻译并放回
PHP - extract text from HTML, translate and put it back
我正在使用 API 来翻译我的博客,但它有时会干扰我的 html,让我有更多的工作来修复所有问题。
我现在要做的是从 html 中提取内容,将其翻译并放回原来的位置。
我首先尝试使用 preg_replace 来执行此操作,我会用 ##a_number## 之类的内容替换每个标签,然后在文本翻译完成后恢复为原始标签.不幸的是,它很难管理,因为我需要用唯一值替换每个标签。
然后我用 "simple 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。
您是否看到更好的选择来实现这一目标?
谢谢
洛朗
<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>
)
然后拆分“>”上的每个数组项。该数组中的第一项是标签。其他每一项如果有一个将被翻译的内容。
翻译完成后,您可以通过再次粘贴数组项来反转它。
例如,我有以下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>
我正在使用 API 来翻译我的博客,但它有时会干扰我的 html,让我有更多的工作来修复所有问题。
我现在要做的是从 html 中提取内容,将其翻译并放回原来的位置。
我首先尝试使用 preg_replace 来执行此操作,我会用 ##a_number## 之类的内容替换每个标签,然后在文本翻译完成后恢复为原始标签.不幸的是,它很难管理,因为我需要用唯一值替换每个标签。
然后我用 "simple 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。
您是否看到更好的选择来实现这一目标?
谢谢 洛朗
<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>
)
然后拆分“>”上的每个数组项。该数组中的第一项是标签。其他每一项如果有一个将被翻译的内容。
翻译完成后,您可以通过再次粘贴数组项来反转它。
例如,我有以下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>