如何使用preg_replace从远程网站翻译日语到英语

时间:2016-02-14 00:43:57

标签: php utf-8 character-encoding preg-replace str-replace

我正在尝试编写一个PHP脚本,将日语烹饪食谱从日语翻译成英语。这是宠物项目,并不是完美的。我的策略是......

  1. 使用file_get_contents
  2. 获取网站内容
  3. 用英语替换一些日语(主要是成分名称)
  4. 将结果写入HTML文件
  5. 我从命令行运行这个PHP脚本:

    <?php
    
        // Get contents of Japanese cooking website
        $url = 'http://recipe.igamono.jp/?eid=1077379';
        $context = stream_context_create(array('http' => array('header' => 'Accept-Charset: UTF-8, *;q=0')));
        $html = file_get_contents($url, false, $context);
    
        // Replace stuff
        $html = preg_replace('/right/s', 'foobar', $html); // works
        $html = preg_replace('/の/s', 'shazam!!', $html); // doesn't work
    
        // Write output to a file
        file_put_contents('output.html', $html);
    
    ?>
    

    我使用Sublime Text编辑文件(translate.php),我确保使用以下文件保存文件:文件/使用编码保存/ UTF-8

    当我运行脚本时,一切都有效,除了更换の。没有の的替代发生。

    但是, 工作:

    <?php
        $html = "one の two の";
        $html = preg_replace('/の/s', 'shazam!!', $html);
    
        file_put_contents('output.html', $html);
    ?>
    

    输出结果为:

      一个shazam !!两个shazam !!

    有什么建议吗?我知道这是一个字符编码问题,但我似乎无法让它发挥作用。

    更新

    这是一个在$ html变量上测试UTF-8编码的修改版本:

    <?php
        // Get contents of Japanese cooking website
        $url = 'http://recipe.igamono.jp/?eid=1077379';
        $context = stream_context_create(array('http' => array('header' => 'Accept-Charset: UTF-8, *;q=0')));
        $html = file_get_contents($url, FILE_TEXT, $context);
    
        if(mb_detect_encoding($html, 'UTF-8')) print("Yep, UTF-8 it is.\n");
        if(! mb_detect_encoding($html, 'UTF-8', true)) print("Well, on second thought.. maybe not!\n");
    
    ?>
    

    输出结果为:

      是的,它是UTF-8。

         

    嗯,第二个想法......也许不是!

    我的解决方案

    这是我提出的一个解决方案:

    <?php
        // Get contents of Japanese cooking website
        $url = 'http://recipe.igamono.jp/?eid=1077379';
        $html = file_get_contents($url);
    
        // Convert HTML to UTF-8 from Japanese
        $html = mb_convert_encoding($html, "UTF-8", "EUC-JP");
    
        // Replace stuff
        $html = preg_replace('/right/s', 'foobar', $html);
        $html = preg_replace('/の/s', 'shazam!!', $html);
    
        // Convert HTML back to Japanese character encoding
        $html = mb_convert_encoding($html, "EUC-JP", "UTF-8");
    
        // Write HTML to a file
        file_put_contents('output.html', $html);
    ?>
    

2 个答案:

答案 0 :(得分:0)

尝试$html = preg_replace('/の/su', 'shazam!!', $html);(使用/ u UTF-8修饰符)。


更新:

使用/ u修饰符时,输入文本(此处为$ html)必须是UTF-8有效,否则根本不会替换任何内容。可以通过mb_check_encoding($string, 'UTF-8')检查输入文本编码。

答案 1 :(得分:0)

建议:

    $html = preg_replace('/[\x{306E}]/u', 'shazam!!', $html);

<强>更新 原来你加载的页面不是UTF-8,而是EUC-JP。这样做的:

<?php

// Get contents of Japanese cooking website
$url = 'http://recipe.igamono.jp/?eid=1077379';
$context = stream_context_create(array('http' => array('header' => 'Accept-Charset: EUC-JP, *;q=0')));
$html = file_get_contents($url, false, $context);

// Replace stuff
$html = mb_convert_encoding($html, "UTF-8", "EUC-JP");
$html = preg_replace('/right/s', 'foobar', $html); // works
$html = preg_replace('/の/s', 'shazam!!', $html); // doesn't work

// Write output to a file
file_put_contents('output.html', $html);
?>

我得到&#34; shazam !!&#34;

shazam