代码之家  ›  专栏  ›  技术社区  ›  Laurent

从HTML中提取文本,翻译并放回原处

  •  0
  • Laurent  · 技术社区  · 6 年前

    我正在使用一个API来翻译我的博客,但是有时候它会把我的HTML搞得一团糟,这样我就可以做更多的工作来修复所有的问题。

    我现在要做的是从HTML中提取内容,翻译并将其放回原来的位置。

    我首先尝试使用preg_replace来实现这一点,在这里我将用一个数字来替换每个标记,然后在翻译完文本后恢复到原始标记。不幸的是,很难管理,因为我需要用一个唯一的值替换每个标记。

    然后我尝试使用“简单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;
        }
    

    这样我可以得到所有的文本,但是值(DIV内部的DIV)中仍然有一些HTML,我不知道如何将翻译后的文本放回原始对象中。这个对象的结构非常复杂,在显示它时,它会使我的浏览器崩溃。

    我已经没有选择了,可能还有更直接的方法。我想找到的是一种方法,可以得到一个对象或数组,其中一边包含所有HTML,另一边包含所有文本。我将循环浏览文本,以便翻译它,并将所有内容合并回去,以避免破坏HTML。

    你看到更好的选择来实现这一点吗?

    谢谢 劳伦特

    2 回复  |  直到 6 年前
        1
  •  1
  •   Victor    6 年前

    例如,我有以下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
  •  1
  •   Henry    6 年前
    <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>
    
    )
    

    然后拆分“>”上的每个数组项。这个数组中的第一项是标记。如果有的话,每一个项目都有翻译的内容。

    当转换完成后,您可以通过再次将数组项粘贴回去来反转它。