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

unicode chars with wikipedia search in PHP

我将一个 PHP 字符串传递到维基百科搜索页面以检索部分定义。 一切正常,除了以 \u... 形式出现的 unicode 字符。这是一个更好地解释自己的例子。可以看到,名字的拼音是不可读的:

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.

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

$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');

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

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

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

维基百科搜索 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...

嗯,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="" target="_blank"></a>', $l);
    echo $link.'<br><br>';
}

好处是现在我可以随心所欲地操作数组了。 你可以看到它的实际效果 here: