在PHP中使用维基百科搜索的unicode字符

时间:2015-12-22 01:12:03

标签: php unicode wikipedia

我将PHP字符串传递给维基百科搜索页面,以便检索部分定义。 除了以 \ u ... 形式出现的unicode字符外,Everythin工作正常。这是一个更好地解释自己的例子。如您所见,该名称的拼音不可读:

  

Henrik Ibsen,Henrik Ibsen \ u02c8h \ u025bn \ u027eik \ u02c8ips \ u0259n   (Skien,20 marzo 1828 - Oslo,23 maggio 1906)èsquouno scrittore,   drammaturgo,poeta e regista teatrale norvegese。

我用来从维基百科获取代码片段的代码是这样的:

$word = $_GET["word"];
$html = file_get_contents('https://it.wikipedia.org/w/api.php?action=opensearch&search='.$word);
$utf8html = html_entity_decode(preg_replace("/U\+([0-9A-F]{4})/", "&#x\\1;", $html), ENT_NOQUOTES, 'UTF-8');

我的代码的最后一行没有解决问题。 你知道如何获得一个完全可读的干净文本吗?

3 个答案:

答案 0 :(得分:1)

你的正则表达式字符串中有一些错误,请尝试使用:

<?php
 $str = "Henrik Ibsen, Henrik Ibsen \u02c8h\u025bn\u027eik \u02c8ips\u0259n(Skien, 20 marzo 1828 - Oslo, 23 maggio 1906) è stato uno scrittore, drammaturgo, poeta e regista teatrale norvegese.";
 $utf8html = preg_replace('@\\\U([0-9A-F]{4})@i', "&#x\\1", $str);
 echo $utf8html;

答案 1 :(得分:1)

维基百科搜索API的输出是JSON。不要试图从中剔除碎片并自己解析字符串文字逃逸,这就是疯狂的谎言。只需使用现成的JSON解析器。

此外,在将单词添加到查询字符串中时,需要对单词进行URL转义,否则对具有URL特殊字符的单词的任何搜索都将失败。

总结:

$word = $_GET['word'];
$url = 'https://it.wikipedia.org/w/api.php?action=opensearch&search='.urlencode($word);
$response = json_decode(file_get_contents($url));

$matching_titles_array = $response[1];
$matching_summaries_array = $response[2];
$matching_urls = $response[3];
...etc...

答案 2 :(得分:0)

好吧,bobince发布的答案肯定比我之前的程序更有效,后者的目的是一点一点地抓取和修剪我需要的东西。只是为了告诉你我是怎么做的,这是我以前的代码:

$html = file_get_contents('https://it.wikipedia.org/w/api.php?action=opensearch&search='.$s);
$decoded = preg_replace('@\\\U([0-9A-F]{4})@i', "&#x\\1", $html);
$par = array("[", "]");
$def_no_par = str_replace($par, "", $decoded);
$def_no_vir = str_replace("\"\",", "", $def_no_par);
$def_cap = str_replace("\",", "\",<br>", $def_no_vir);
$def_pulita = str_replace("\"", "", $def_cap);
$def_clean = str_replace(".,", ".", $def_pulita);
$definizione = str_replace("$s,", "", $def_clean);
$out = str_replace("\\", "\"", $definizione);

正如您所看到的,删除部分输出以使其更具可读性非常令人厌烦(并且不完全成功)。 使用JSON方法使一切更加线性。这是我的新解决方法:

$search = 'https://it.wikipedia.org/w/api.php?action=opensearch&search='.urlencode($s);
$response = json_decode(file_get_contents($search));
$matching_titles_array = $response[1];
$matching_summaries_array = $response[2];
$matching_urls = $response[3];

echo '<h3><div align="center"><font color=" #A3A375">'.$titolo.'</font></div></h3><br><br>';
foreach($response[1] as $t) {
    echo '<font color="#5C85D6"><b>'.$t.'</b></font><br><br>';
}
foreach($response[2] as $s) {
    echo $s.'<br><br>';
}
foreach($response[3] as $l) {
$link = preg_replace('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1" target="_blank">$1</a>', $l);
    echo $link.'<br><br>';
}

优点是现在我可以按照自己的意愿操作数组。 您可以在行动here中看到它: