在 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:
我将一个 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: