【问题标题】:Parsing Unicode JSON object in PHP 5.3在 PHP 5.3 中解析 Unicode JSON 对象
【发布时间】:2013-07-19 22:39:43
【问题描述】:

我正在尝试在 PHP 5.3 中解析推文中的文本,但在解析包含 Unicode 字符的用户提及、主题标签和链接时遇到问题。

首先我获取推文并将其存储到 txt 文件中:

$tweets_file = createFile('cache/'.$twitteruser.'-tweets.txt', json_encode($tweets));

之后,在我的文本文件中,我可以看到一堆 Unicode 字符(例如 Landsli\u00f0sma\u00f0ur)。

当我尝试显示所有推文时,我会这样做:

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

$tweets_file = file_get_contents('cache/'.$queried_user.'-tweets.txt');
$tweets = json_decode($tweets_file);
foreach($tweets as $tweet) {
  echo twitterify($tweet->text);
  // do other stuff...
}

例如,在主题标签中出现 Unicode 字符之前,这里一切正常。我的preg_replace 停在那个字符上,像#rafhlaða 这样的标签会呈现为&lt;a href="#"&gt;#rafhla&lt;/a&gt;ða

如何才能正确渲染出包含 Unicode 字符的文本?

【问题讨论】:

标签: php regex unicode json


【解决方案1】:

我无法重现您的错误。我从 pastebin 中取出 JSON 数据,并将其修改为最简单的情况:

[{"text":"#rafhla\u00f0a"}]

所以,文字只有 1 个字:rafhlaða

然后运行以下脚本:

<?php
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;
}


$tweets_file = file_get_contents('file.txt');
$tweets = json_decode($tweets_file);
foreach($tweets as $tweet) {
    print $tweet->text;
    print "\n";
    echo twitterify($tweet->text);
    exit;
}

打印出来了:

#rafhlaða
<a href="http://search.twitter.com/search?q=rafhlaða" target="_blank">#rafhlaða</a>

这与您的陈述相矛盾:

#rafhlaða renders to <a href="#">#rafhla</a>ða

更新

<?php
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("/@(.+?)(?=\s|$)/", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $ret);
    $ret = preg_replace("/#(.+?)(?=\s|$)/", "<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $ret);
    return $ret;
}


$tweet = '[{"text":"#rafhla\u00f0a #rafhla\u00f0a"}]';
$tweet = json_decode($tweet);
print $tweet[0]->text;
print "\n";
echo twitterify($tweet[0]->text);

打印:

#rafhlaða #rafhlaða

&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=rafhlaða" target="_blank"&gt;#rafhlaða&lt;/a&gt;

【讨论】:

  • 嗯,这很奇怪......我用我的三次检查了你的 sn-p,但我仍然有这个问题 =/
  • @errata 也许,我们的 php 解释器中的 Unicode 支持有所不同?我的是 PHP 5.4.7 (cli) (build: Sep 14 2012 14:44:02) 在 Linux Slackware 14.0 上运行
  • 我什至试图重现你的情况。仍然遇到同样的问题...我的 PHP 在 Mac OS X 10.8.4 上是 v5.3.15。
  • @errata 这里我尝试在线复现,但是成功了ideone.com/M1umyK
  • @errata 我找到了原因:“Unix 上的 PHP 4.1.0 或更高版本以及 win32 上的 PHP 4.2.3 都可以使用此修饰符”php.net/manual/en/reference.pcre.pattern.modifiers.php
【解决方案2】:

尝试将此添加到您的脚本中(并省略 preg_replace):

header('Content-Type: application/json; Charset=UTF-8');

解决方案二:

$tweets_file = file_get_contents('cache/'.$queried_user.'-tweets.txt', FILE_TEXT);

【讨论】:

  • 嗯,但是我的页面不会呈现为 HTML 内容,而是呈现为纯文本?就像我正在查看文件的来源一样。
  • 那么问题来了,你为什么将JSON数据存储在txt文件(cache/'.$queried_user.'-tweets.txt)而不是.json文件中?
  • 我尝试保存 .json 文件,并尝试在读取 txt 文件时添加 FILE_TEXT。还是一样的问题=(
猜你喜欢
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2018-07-28
  • 2015-07-16
  • 2014-04-05
相关资源
最近更新 更多