在PHP5.3中解析Unicode JSON对象

在PHP5.3中解析Unicode JSON对象,php,regex,unicode,json,Php,Regex,Unicode,Json,我试图在PHP5.3中解析推文中的文本,但在解析包含Unicode字符的用户提及、哈希标记和链接时遇到问题 首先,我获取推文并将其存储到txt文件: $tweets_file = createFile('cache/'.$twitteruser.'-tweets.txt', json_encode($tweets)); 之后,在我的文本文件中,我可以看到一串Unicode字符(例如,Landsli\u00f0sma\u00f0ur) 当我尝试显示所有推文时,我是这样做的: function t

我试图在PHP5.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...
}
函数twitterify($text){
$text=preg#u replace(“#(^|[\n])([\w]+?:/[\w]+[^\”\n\r\t<]*)#u“,“\\1”,$text);
$text=preg#u replace(“#(^|[\n])((www ^ ftp)\.[^\“\t\n\r<]*)#u”、“\\1”、$text);
$text=preg_replace(“/@(\w+)/u”,”,$text);
$text=preg#u replace(“/#(\w+)/u“,”,$text);
返回$text;
}
$tweets\u file=file\u get\u contents('cache/'。$queryed\u user.-tweets.txt');
$tweets=json_解码($tweets_文件);
foreach($tweets作为$tweet){
echo twitterify($tweet->text);
//做其他事情。。。
}
例如,在hashtag中出现Unicode字符之前,这里的一切都很正常。我的
pregðu replace
在该字符处停止,像
#rafhlaða
这样的标签将呈现为
ða


如何正确呈现包含Unicode字符的文本?

尝试将此添加到脚本中(并省去preg\u replace):

解决方案二:

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

我不能重现你的错误。我从pastebin获取JSON数据,并将其修改为最简单的情况:

[{"text":"#rafhla\u00f0a"}]
所以,文本只有一个字: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;
}

plz,将文件内容发布到pastebin中,并添加链接到questionContents of the file is here Hm,但我的页面不会呈现为HTML内容,而是呈现为纯文本?就像我在查看文件的源代码一样。然后问题是,为什么要将JSON数据存储在txt文件(cache/'.$queryed_user.'-tweets.txt)而不是.JSON文件中?我尝试保存.JSON文件,并在读取txt文件时尝试添加文件文本。还是一样的问题=(好吧,这很奇怪…我用我的代码三次检查了你的代码片段,但我仍然有这个问题=/@errata也许,我们的php解释器中的Unicode支持有所不同?我的是PHP5.4.7(cli)(构建时间:2012年9月14日14:44:02)在Linux Slackware 14.0上运行时,我甚至尝试复制您的案例。仍然遇到同样的问题…我的PHP在Mac OS X 10.8.4上是v5.3.15。@这里的勘误表我尝试在线复制,但它成功地工作了@errata我找到了原因:“此修饰符在Unix上可从PHP 4.1.0或更高版本获得,在win32上可从PHP 4.2.3获得”
<?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);