【问题标题】:PHP - extract text from HTML, translate and put it backPHP - 从 HTML 中提取文本,翻译并放回
【发布时间】:2019-05-17 05:55:45
【问题描述】:

我正在使用 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。

您有没有更好的选择来实现这一目标?

谢谢 洛朗

【问题讨论】:

    标签: php html-parsing text-parsing


    【解决方案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>
    

    【讨论】:

      【解决方案2】:
      <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 页面中预先将所有文本编码为 htmlentities。第二(如果第一个没有选项)查看标签部分的长度,如果它比通常的标签长度​​更长,那么它是带有 . 的文本
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2011-01-14
      • 1970-01-01
      • 2021-08-19
      • 2011-07-20
      • 2023-03-27
      相关资源
      最近更新 更多