全文搜索 - 忽略搜索短语中的波兰语字母

时间:2015-04-14 21:09:24

标签: php

是否可以使用全文搜索忽略搜索短语中的波兰语字符?例如,我的数据库中有一部电影。这部电影的标题是:“PięćdziesiąttwarzyGreya”。如果访问者使用短语“piecdziesiat”进行搜索,我的脚本应该找到一个包含短语的电影:“piecdziesiat”(并忽略任何波兰语字母)。

这可能吗?

3 个答案:

答案 0 :(得分:2)

您可以使用strtr()将带有变音符号的字符串转换为不带变音符号的字符串。例如,它可以将'Pięćdziesiąt'转换为'piecdziesiat'。有一个comment on the PHP documentation page,其中包含一个包含良好翻译表的有用功能。

为了后人的缘故,那就是:

function normalize ($string) {
    $table = array(
        'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',
        'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
        'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
        'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
        'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
        'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',
        'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
        'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r',
    );

    return strtr($string, $table);
}

因此用户搜索“Pięćdziesiąt”并将其转换为“piecdziesiat”(您也可以通过strtolower()运行它)。然后在你的数据库中你有一个'canonicalised version'字段,它已经删除了任何变音符号。在数据库中搜索时,搜索规范字段而不是标题字段。

另一个选项取决于您使用的数据库。 PostgreSQL具有unaccent功能,允许您在数据库端执行此操作,而无需“规范”字段。 MySQL / MariaDB中还有UTF8-bin模式,我很确定MongoDB具有类似的功能。

答案 1 :(得分:0)

您是否尝试过使用preg_replace?找到此主题以删除非英语字符

Remove Non English Characters PHP

答案 2 :(得分:0)

使用PHP自己的iconv函数来解决此问题。

$output = iconv("utf-8", "ascii//TRANSLIT", $input);

可以在此处找到更详细的示例:http://php.net/manual/en/function.iconv.php#83238