有没有办法将重音字符转换成最接近的非重音字符?

时间:2012-02-10 14:07:25

标签: php url

我必须将像“você-é-um-ás-da-aviação”这样的网址转换为“voce-e-um-as-da-aviacao”,以使其在SERP上阅读友好。

我可以使用常见的替代品,但我真的不想列出每个角色,因为我发现它很笨重,我想尽可能多地保留源代码中的语言特定字符。

有可能吗?它可行吗?

4 个答案:

答案 0 :(得分:3)

function url_safe($string){
    $url = $string;
    setlocale(LC_ALL, 'fr_FR'); // change to the one of your language
    $url = iconv("UTF-8", "ASCII//TRANSLIT", $url);  
    $url = preg_replace('~[^\\pL0-9_]+~u', '-', $url);
    $url = trim($url, "-");
    $url = strtolower($url);
    return $url;
    }

答案 1 :(得分:2)

您可以使用Unicode基础提供的规范分解映射(http://www.unicode.org/Public/UNIDATA/中的文件)。

然而,这并不像你认为的那么简单 - 信不信由你,有一个“kcal”符号,其规范分解为四个字符长。

您可能还希望查阅那里的数字等效表,因为“带圆圈的数字7”应该可能映射到ASCII数字7,依此类推。

我强烈建议不要采用这种策略 - 你要对你的文本进行屠杀以获得微不足道的收益,并且在你改变之后无法恢复原始输入。

答案 2 :(得分:0)

我建议您将每个特殊字符映射,然后将其替换为数组,然后用正则表达式替换文本。
我知道您声明您不想使用常用替换,但这是唯一可行方式。您可以将它们过滤掉(通过检查它们的ascii代码是否位于特定范围内)但是对于正确的替换它们并不相同。

答案 3 :(得分:0)

您可以使用iconv的组合将字符串作为ASCII,然后使用一些preg_replace来删除不需要的字符。

类似的东西:

$string = "você-é-um-ás-da-aviação";
$collated = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
$filtred = preg_replace('`[^-a-zA-Z0-9]`', '', $collated);
echo $filtred;