【问题标题】:Parsing unicode tweet text in PHP在 PHP 中解析 unicode 推文文本
【发布时间】:2013-07-20 17:04:52
【问题描述】:

我不确定我的脚本的哪一部分实际上是错误的,但是我在解析带有 unicode 字符的推文文本时遇到了一些困难:

推文示例:

Landsliðsmaður með viti. #rafhlaða #hræddur http://t.co/ci03F3vUNM

当我使用 twitteroauth 获取它并将其保存到 .txt 文件时,此字符串在文件中转换为:

Landsli\u00f0sma\u00f0ur me\u00f0 viti. #rafhla\u00f0a #hr\u00e6ddur http:\/\/t.co\/ci03F3vUNM

我正在使用简单的preg_replace 用超链接替换文本

function twitterify($ret) {
  $ret = preg_replace("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t< ]*)#", "\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $ret);
  $ret = preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r< ]*)#", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $ret);
  $ret = preg_replace("/@(\w+)/", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $ret);
  $ret = preg_replace("/#(\w+)/", "<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $ret);
  return $ret;
}

但是只要遇到以下 unicode 字符之一就会失败:
#rafhlaða 变为 &lt;a href="#"&gt;#rafhla&lt;/a&gt;ða
#hræddur 变为 &lt;a href="#"&gt;#hr&lt;/a&gt;æddur
和类似的。

我在这里做错了什么?使用 PHP 保存/打开我的文本文件或解析 unicode 编码字符串?

【问题讨论】:

    标签: php regex twitter unicode


    【解决方案1】:

    看这里,我将 u 修饰符放在所有正则表达式的末尾,它起作用了。将文件另存为 utf8。如果你有 json 编码的字符串,你可以解码它,使用这个解决方案:Php/json: decode utf8?

    <?php
    function ewchar_to_utf8($matches) {
        $ewchar = $matches[1];
        $binwchar = hexdec($ewchar);
        $wchar = chr(($binwchar >> 8) & 0xFF) . chr(($binwchar) & 0xFF);
        return iconv("unicodebig", "utf-8", $wchar);
    }
    
    function special_unicode_to_utf8($str) {
        return preg_replace_callback("/\\\u([[:xdigit:]]{4})/i", "ewchar_to_utf8", $str);
    }
    
    $text = 'Landsli\u00f0sma\u00f0ur me\u00f0 viti. #rafhla\u00f0a #hr\u00e6ddur http:\/\/t.co\/ci03F3vUNM';
    $text = special_unicode_to_utf8($text);
    
    function twitterify($ret) {
      $ret = preg_replace("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t< ]*)#u", "\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $ret);
      $ret = preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r< ]*)#u", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $ret);
      $ret = preg_replace("/@(\w+)/u", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $ret);
      $ret = preg_replace("/#(\w+)/u", "<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $ret);
      return $ret;
    }
    
    $text = twitterify($text);
    print $text;
    

    打印:

    Landsliðsmaður með viti. &lt;a href="http://search.twitter.com/search?q=rafhlaða" target="_blank"&gt;#rafhlaða&lt;/a&gt; &lt;a href="http://search.twitter.com/search?q=hræddur" target="_blank"&gt;#hræddur&lt;/a&gt; http:\/\/t.co\/ci03F3vUNM

    【讨论】:

    • 感谢您修复正则表达式,但似乎我应该在保存到文件之前转义 unicode 字符,在 json_encode 函数中,它具有 PHP v5.4+ 的特定选项(当然)我无法升级-.-
    • @errata 我更新了答案,解码了 json 编码的 urf8。请看。我不确定是否只在 http:\/\/ 中转义斜线
    • 感谢所有的努力!但是,这仍然不起作用,我想那是因为我在循环我的数组之后我做了json_decode($tweets_file);。实际上,如果我在twitterify() 中执行var_dump($ret);,我就看不到unicode 字符了,但它们存储在文本文件中。
    • @errata 我不知道,您的文件内容是什么以及您如何阅读它。请发布代码,以便我可以重现该问题。但最好在发帖之前尽量减少问题。也许,你可以自己解决。
    • @errata 或者最好将其作为一个新问题发布。我想,我在当前问题的范围内给了你答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多