【问题标题】:Is there a way to turn accented characters into the closest non-accent counterpart?有没有办法将重音字符变成最接近的非重音字符?
【发布时间】:2012-02-10 14:07:25
【问题描述】:

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

我可以做一个普通的替换,但我真的不喜欢列出每个字符,因为我觉得它很笨重,而且我想尽可能地将语言特定的字符排除在源代码之外。

有可能吗?可行吗?

【问题讨论】:

标签: php url


【解决方案1】:
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;
    }

【讨论】:

    【解决方案2】:

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

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

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

    但是,我强烈建议您不要使用这种策略 - 您会为了一点点收益而牺牲文本,并且一旦转换了原始输入,就无法恢复它。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您可以使用 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;
        

        【讨论】:

          猜你喜欢
          • 2012-08-02
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-22
          • 2012-12-16
          相关资源
          最近更新 更多