【问题标题】:How do I remove accents from characters in a PHP string?如何从 PHP 字符串中的字符中删除重音符号?
【发布时间】:2010-11-04 07:02:43
【问题描述】:

我正在尝试从 PHP 字符串中的字符中删除重音符号,这是使字符串在 URL 中可用的第一步。

我正在使用以下代码:

$input = "Fóø Bår";

setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);

print($output);

我期望的输出是这样的:

F'oo Bar

但是,重音字符不会被音译,而是用问号代替:

F?? B?r

我在网上能找到的一切都表明设置区域设置可以解决这个问题,但是我已经在这样做了。我已经检查了以下详细信息:

  1. 服务器支持我设置的语言环境(包含在locale -a生成的列表中)
  2. 服务器的 iconv 版本支持源和目标编码(UTF-8 和 ASCII)(包含在iconv -l 生成的列表中)
  3. 输入字符串采用 UTF-8 编码(使用 PHP 的 mb_check_encoding 函数验证,如 answer by mercator 中所建议的那样)
  4. setlocale 的调用成功(返回'en_US.utf8' 而不是FALSE

问题原因:

服务器使用了错误的 iconv 实现。它具有 glibc 版本,而不是所需的 libiconv 版本。

请注意,某些系统上的 iconv 功能可能无法按预期工作。在这种情况下,最好安装 GNU libiconv 库。它很可能最终会得到更一致的结果。
PHP manual's introduction to iconv

有关 PHP 使用的 iconv 实现的详细信息包含在 phpinfo 函数的输出中。

(我无法在我正在为这个项目使用的服务器上使用正确的 iconv 库重新编译 PHP,所以我在下面接受的答案是在没有 iconv 的情况下删除重音最有用的答案支持。)

【问题讨论】:

  • 请注意,如果你在一个不能是 ASCII 的字符串上运行它,这将产生巨大的影响。例如,俄语字符串不适用于 ASCII。
  • 我安装了 glibc 版本,并且设置语言环境适合我。
  • 所以你必须编译它?我在任何地方都找不到 deb 包。正是因为 glibc 中的“IT'S”已经存在的原因:-(
  • 这家伙提出了一个使用 htmlentities() 的巧妙解决方案。抱歉,它是法语,但您只需要文档底部的小功能:weirdog.com/blog/php/… 真聪明:)
  • 想看@JFG所说的代码,你也可以在这里找到:github.com/ICanBoogie/Common/blob/…

标签: php iconv


【解决方案1】:

我认为这里的问题是您的编码将 ä 和 å 考虑为与“a”不同的符号。事实上,strtr 的 PHP 文档提供了一个以丑陋的方式去除重音的示例:(

http://ie2.php.net/strtr

【讨论】:

  • 我认为你应该建议 mb_strstr() 代替,因为他的输入是 UTF8
  • iconv 调用中的 //TRANSLIT 旨在转换为目标编码中最接近的可用替代。这应该包括删除重音符号,或将单个字符转换为两个字符,例如ñ可能会变成n~
  • 由于服务器不正确支持iconv,看来我还是会这样做。谢谢杰里米。
  • @karim79 mb_strstr是错误的函数,没有mb_strtr
【解决方案2】:

您可以使用 urlencode。不完全符合您的要求(删除重音符号),但会给您一个 url 可用字符串

$output = urlencode ($input);

在 Perl 中我可以使用翻译正则表达式,但我想不出 PHP 等价物

$input =~ tr/áâàå/aaaa/;

等等……

你可以使用 preg_replace 来做到这一点

$patterns[0] = '/[á|â|à|å|ä]/';
$patterns[1] = '/[ð|é|ê|è|ë]/';
$patterns[2] = '/[í|î|ì|ï]/';
$patterns[3] = '/[ó|ô|ò|ø|õ|ö]/';
$patterns[4] = '/[ú|û|ù|ü]/';
$patterns[5] = '/æ/';
$patterns[6] = '/ç/';
$patterns[7] = '/ß/';
$replacements[0] = 'a';
$replacements[1] = 'e';
$replacements[2] = 'i';
$replacements[3] = 'o';
$replacements[4] = 'u';
$replacements[5] = 'ae';
$replacements[6] = 'c';
$replacements[7] = 'ss';

$output = preg_replace($patterns, $replacements, $input);

(请注意,这是星期五中午记忆后喝啤酒时打出来的,所以可能不是 100% 正确)

或者你可以制作一个哈希表并以此为基础进行替换。

【讨论】:

  • php 相当于 tr/.../... 是 strtr
【解决方案3】:

我同意乔治布洛克的评论。

如果你找到了让 //TRANSLIT 工作的方法,你可以建立友好的 URL:

  1. 使用 iconv 和 //TRANSLIT ñ => n~
    • 删除单词中的非字母数字非空白字符:$url = preg_replace( '/(\w)[^\w\s](\w)/', '$1$2', $url );
    • 替换剩余的分色:$url = preg_replace( '/[^a-z0-9]+/', '-', $url );
    • 删除双/领先/跟踪:$url = preg_replace( '-',例如'/(?:(^|\-)\-+|\-$)/', '', $url );

如果您无法使其工作,请将 setp 1 替换为基于 strtr/字符的替换,例如 Xetius 的解决方案。

【讨论】:

    【解决方案4】:

    我无法重现您的问题。我得到了预期的结果。

    您究竟如何使用mb_detect_encoding() 来验证您的字符串实际上是 UTF-8?

    如果我在字符串的 UTF-8 和 ISO-8859-1 编码版本上都调用 mb_detect_encoding($input),它们都返回“UTF-8”,因此该函数不是特别可靠。

    iconv() 在收到错误编码的字符串并且只回显“F”时给了我一个 PHP“通知”,但这可能只是因为不同的 PHP/iconv 设置/版本 (?)。

    我建议您先尝试调用mb_check_encoding($input, "utf-8") 以验证您的字符串真的 是UTF-8。 我认为可能不是。

    【讨论】:

    • 感谢您的提示。 mb_check_encoding($input, "utf-8") 返回 TRUE。另外,我已经在使用 error_reporting(E_ALL) 所以应该不会有任何错误从我身边溜走。
    • 嗯,我明白你的意思了。我现在在另一台机器上尝试了它,它返回“Fo?Bar”。你用的是什么 PHP 和 iconv 版本?
    • 我认为是 iconv 版本有问题 - 此服务器使用的是 glibc 版本而不是 libiconv 版本。
    • 谢谢墨卡托,你真的很有帮助。
    • 也感谢您的解释。我没有意识到这不仅仅是版本号。我的差异也是由于不同的 iconv 实现。
    【解决方案5】:

    我在网上偶然发现的一个技巧是使用 htmlentities 然后剥离编码字符:

    $stripped = preg_replace('`&[^;]+;`','',htmlentities($string));
    

    并不完美,但在某些情况下确实可以正常工作。

    但是,您正在撰写有关创建 URL 字符串的文章,因此 urlencode 及其对应的 urldecode 可能会更好。或者,如果您要创建查询字符串,请使用最后一个函数:http_build_query

    【讨论】:

      【解决方案6】:

      使用iconv时,必须设置参数locale:

      function test_enc($text = 'ěščřžýáíé ĚŠČŘŽÝÁÍÉ fóø bår FÓØ BÅR æ')
      {
          echo '<tt>';
          echo iconv('utf8', 'ascii//TRANSLIT', $text);
          echo '</tt><br/>';
      } 
      
      test_enc();
      setlocale(LC_ALL, 'cs_CZ.utf8');
      test_enc();
      setlocale(LC_ALL, 'en_US.utf8');
      test_enc();
      

      产生:

      ????????? ????????? f?? b?r F?? B?R ae
      escrzyaie ESCRZYAIE fo? bar FO? BAR ae
      escrzyaie ESCRZYAIE fo? bar FO? BAR ae
      

      其他语言环境,然后是 cs_CZ 和 en_US 我还没有安装,我无法测试它。

      在 C# 中,我看到了使用转换为 unicode 规范化形式的解决方案 - 重音被拆分出来,然后通过非间距 unicode 类别进行过滤。

      【讨论】:

        【解决方案7】:

        这是我发现并经常使用的一段代码:

        function stripAccents($stripAccents){
          return strtr($stripAccents,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ','aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
        }
        

        【讨论】:

        • 由于 strtr() 不支持多字节,如果您的脚本文件以多字节格式(例如 UTF-8)编码,则此函数会产生错误的结果。
        • 是的。我尝试 fork 一个 github 项目只是为了编辑一行,甚至与重音字符无关,但是当我保存更改并创建拉取请求时,它包括对所有重音字符硬编码的行的附加更改。更安全的方法是使用 chr()。
        • ...另外 - 此列表不包含 许多 重音字符,例如ů, ž, ř, č, ...
        • Señor、Bjørk、Ł 等。这是一个远远超过这里的列表。
        【解决方案8】:

        WordPress implementation 呢?

        function remove_accents($string) {
            if ( !preg_match('/[\x80-\xff]/', $string) )
                return $string;
        
            $chars = array(
            // Decompositions for Latin-1 Supplement
            chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
            chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
            chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
            chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
            chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
            chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
            chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
            chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
            chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
            chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
            chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
            chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
            chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
            chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
            chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
            chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
            chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
            chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
            chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
            chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
            chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
            chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
            chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
            chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
            chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
            chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
            chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
            chr(195).chr(191) => 'y',
            // Decompositions for Latin Extended-A
            chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
            chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
            chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
            chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
            chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
            chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
            chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
            chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
            chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
            chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
            chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
            chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
            chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
            chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
            chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
            chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
            chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
            chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
            chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
            chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
            chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
            chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
            chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
            chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
            chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
            chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
            chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
            chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
            chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
            chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
            chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
            chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
            chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
            chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
            chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
            chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
            chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
            chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
            chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
            chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
            chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
            chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
            chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
            chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
            chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
            chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
            chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
            chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
            chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
            chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
            chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
            chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
            chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
            chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
            chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
            chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
            chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
            chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
            chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
            chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
            chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
            chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
            chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
            chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
            );
        
            $string = strtr($string, $chars);
        
            return $string;
        }
        

        要了解此函数的作用,请查看转换表:

        À => A
        Á => A
        Â => A
        Ã => A
        Ä => A
        Å => A
        Ç => C
        È => E
        É => E
        Ê => E
        Ë => E
        Ì => I
        Í => I
        Î => I
        Ï => I
        Ñ => N
        Ò => O
        Ó => O
        Ô => O
        Õ => O
        Ö => O
        Ù => U
        Ú => U
        Û => U
        Ü => U
        Ý => Y
        ß => s
        à => a
        á => a
        â => a
        ã => a
        ä => a
        å => a
        ç => c
        è => e
        é => e
        ê => e
        ë => e
        ì => i
        í => i
        î => i
        ï => i
        ñ => n
        ò => o
        ó => o
        ô => o
        õ => o
        ö => o
        ù => u
        ú => u
        û => u
        ü => u
        ý => y
        ÿ => y
        Ā => A
        ā => a
        Ă => A
        ă => a
        Ą => A
        ą => a
        Ć => C
        ć => c
        Ĉ => C
        ĉ => c
        Ċ => C
        ċ => c
        Č => C
        č => c
        Ď => D
        ď => d
        Đ => D
        đ => d
        Ē => E
        ē => e
        Ĕ => E
        ĕ => e
        Ė => E
        ė => e
        Ę => E
        ę => e
        Ě => E
        ě => e
        Ĝ => G
        ĝ => g
        Ğ => G
        ğ => g
        Ġ => G
        ġ => g
        Ģ => G
        ģ => g
        Ĥ => H
        ĥ => h
        Ħ => H
        ħ => h
        Ĩ => I
        ĩ => i
        Ī => I
        ī => i
        Ĭ => I
        ĭ => i
        Į => I
        į => i
        İ => I
        ı => i
        IJ => IJ
        ij => ij
        Ĵ => J
        ĵ => j
        Ķ => K
        ķ => k
        ĸ => k
        Ĺ => L
        ĺ => l
        Ļ => L
        ļ => l
        Ľ => L
        ľ => l
        Ŀ => L
        ŀ => l
        Ł => L
        ł => l
        Ń => N
        ń => n
        Ņ => N
        ņ => n
        Ň => N
        ň => n
        ʼn => N
        Ŋ => n
        ŋ => N
        Ō => O
        ō => o
        Ŏ => O
        ŏ => o
        Ő => O
        ő => o
        Œ => OE
        œ => oe
        Ŕ => R
        ŕ => r
        Ŗ => R
        ŗ => r
        Ř => R
        ř => r
        Ś => S
        ś => s
        Ŝ => S
        ŝ => s
        Ş => S
        ş => s
        Š => S
        š => s
        Ţ => T
        ţ => t
        Ť => T
        ť => t
        Ŧ => T
        ŧ => t
        Ũ => U
        ũ => u
        Ū => U
        ū => u
        Ŭ => U
        ŭ => u
        Ů => U
        ů => u
        Ű => U
        ű => u
        Ų => U
        ų => u
        Ŵ => W
        ŵ => w
        Ŷ => Y
        ŷ => y
        Ÿ => Y
        Ź => Z
        ź => z
        Ż => Z
        ż => z
        Ž => Z
        ž => z
        ſ => s
        

        您可以通过简单地遍历函数的$chars 数组来自己生成转换表:

        foreach($chars as $k=>$v) {
           printf("%s -> %s", $k, $v);
        }
        

        【讨论】:

        • 效果很好+1,可惜链接坏了。
        • 这应该是公认的答案,因为它是以更安全的方式实现的(使用 chr() 函数),而不是硬编码重音字符,这可能会在某些文本编辑器中被覆盖。
        • 请注意,新实现现在位于此处:core.trac.wordpress.org/browser/tags/4.1/src/wp-includes/…。该代码需要与 wordpress 核心一样提供的其他功能,并且在没有一些(轻)工作的情况下无法复制/粘贴。
        • 作为一个魅力工作,谢谢!
        • 需要注意的是 WordPress 是 GPLv2 许可的。
        【解决方案9】:

        上面 Gino 发布的简单函数的 UTF-8 友好版本:

        function stripAccents($str) {
            return strtr(utf8_decode($str), utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'), 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
        }
        

        因为我的 php 文档是 UTF-8 编码的,所以不得不这样做。

        希望对你有帮助。

        【讨论】:

        • UTF8 中的某些字符在我使用此功能时无法正常工作。我相信这是由于 utf8_decode(),它将 UTF8 转换为 ISO-8859-1。
        • @trevor-gehman: strtr() 仅适用于单字节字符,因此 Unicode Latin-1 Supplement 中的字符。
        • Strtr 可以很好地替换多字节 UTF8 字符,但您需要使用提供关联数组作为第二个参数的变体。然后,您可以在该数组的任何位置使用多字节字符作为键或值。确保您的文本编辑器处于 UTF8 模式或使用“\xc2\x81”类型语法进行编码。
        • 这是一个非常不完整的实现,见 John R 的回复
        【解决方案10】:

        确实是品味问题。转换此类字母的方式有很多种。

        function replaceAccents($str)
        {
          $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
          $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
          return str_replace($a, $b, $str);
        }
        

        【讨论】:

        • 这是一个非常不完整的实现,见 John R 的回复
        【解决方案11】:

        WordPress 的实现对于 UTF8 字符串绝对是最安全的。对于 Latin1 字符串,一个简单的 strtr 可以完成这项工作,但请确保您将脚本保存为 LATIN1 格式,而不是 UTF-8。

        【讨论】:

          【解决方案12】:

          将 Cazuma Nii Cavalcanti 的实现与 Junior Mayhé 的字符列表合并,希望为你们中的一些人节省一些时间。

          function stripAccents($str) {
              return strtr(utf8_decode($str), utf8_decode('ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïñòóôõöøùúûüýÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƒƠơƯưǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǺǻǼǽǾǿ'), 'AAAAAAAECEEEEIIIIDNOOOOOOUUUUYsaaaaaaaeceeeeiiiinoooooouuuuyyAaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiIJijJjKkLlLlLlLlllNnNnNnnOoOoOoOEoeRrRrRrSsSsSsSsTtTtTtUuUuUuUuUuUuWwYyYZzZzZzsfOoUuAaIiOoUuUuUuUuUuAaAEaeOo');
          }
          

          【讨论】:

          • 您正在尝试 utf8_decode 非 latin1 字符,这会给您返回“?”特点。此外,由于 Ǽ 到 AE 的转换,您的字符串长度也不同。这种方法行不通。
          【解决方案13】:

          最简单的方法是使用iconv() PHP 原生函数。

           echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', "Thîs îs à vêry wrong séntènce!");
          
           // output: This is a very wrong sentence!
          

          【讨论】:

          • 这不是很可靠echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'usuario o contraseña incorrectos');输出usuario o contrase?a incorrectos
          • 对于您的示例,您可以使用:setlocale(LC_CTYPE, 'cs_CZ'); echo iconv('UTF-8', 'ASCII//TRANSLIT', "usuario o contraseña incorrectos"); // output: usuario o contrasena incorrectos。有关更多信息,请参阅 PHP 文档。一切都在那里! php.net/manual/en/function.iconv.php
          • iconv UTF8 转 ASCII 音译似乎很奇怪。我的语言环境得到“usuario o contrase~na wrongdos”。它将 ñ 转换为 ~n 和 ö 转换为 :o 我发现音译为 latin1 然后手动转换扩展 ascii 效果最好。
          • @Phil_1984_ 你的语言环境是什么?
          • @Mark 刚刚意识到我的 setlocale 命令在我的 Windows 上返回 false。它应该使用“en_UK”。可能是我的 iconv 的 Windows 错误。
          【解决方案14】:

          您可以使用数组键 => 值样式与 strtr() 一起安全地用于 UTF-8 字符,即使它们是多字节的。

          function no_accent($str){
              $accents = array('À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'Ā' => 'A', 'ā' => 'a', 'Ă' => 'A', 'ă' => 'a', 'Ą' => 'A', 'ą' => 'a', 'Ç' => 'C', 'ç' => 'c', 'Ć' => 'C', 'ć' => 'c', 'Ĉ' => 'C', 'ĉ' => 'c', 'Ċ' => 'C', 'ċ' => 'c', 'Č' => 'C', 'č' => 'c', 'Ð' => 'D', 'ð' => 'd', 'Ď' => 'D', 'ď' => 'd', 'Đ' => 'D', 'đ' => 'd', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'Ē' => 'E', 'ē' => 'e', 'Ĕ' => 'E', 'ĕ' => 'e', 'Ė' => 'E', 'ė' => 'e', 'Ę' => 'E', 'ę' => 'e', 'Ě' => 'E', 'ě' => 'e', 'Ĝ' => 'G', 'ĝ' => 'g', 'Ğ' => 'G', 'ğ' => 'g', 'Ġ' => 'G', 'ġ' => 'g', 'Ģ' => 'G', 'ģ' => 'g', 'Ĥ' => 'H', 'ĥ' => 'h', 'Ħ' => 'H', 'ħ' => 'h', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'Ĩ' => 'I', 'ĩ' => 'i', 'Ī' => 'I', 'ī' => 'i', 'Ĭ' => 'I', 'ĭ' => 'i', 'Į' => 'I', 'į' => 'i', 'İ' => 'I', 'ı' => 'i', 'Ĵ' => 'J', 'ĵ' => 'j', 'Ķ' => 'K', 'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'L', 'ĺ' => 'l', 'Ļ' => 'L', 'ļ' => 'l', 'Ľ' => 'L', 'ľ' => 'l', 'Ŀ' => 'L', 'ŀ' => 'l', 'Ł' => 'L', 'ł' => 'l', 'Ñ' => 'N', 'ñ' => 'n', 'Ń' => 'N', 'ń' => 'n', 'Ņ' => 'N', 'ņ' => 'n', 'Ň' => 'N', 'ň' => 'n', 'ʼn' => 'n', 'Ŋ' => 'N', 'ŋ' => 'n', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'Ō' => 'O', 'ō' => 'o', 'Ŏ' => 'O', 'ŏ' => 'o', 'Ő' => 'O', 'ő' => 'o', 'Ŕ' => 'R', 'ŕ' => 'r', 'Ŗ' => 'R', 'ŗ' => 'r', 'Ř' => 'R', 'ř' => 'r', 'Ś' => 'S', 'ś' => 's', 'Ŝ' => 'S', 'ŝ' => 's', 'Ş' => 'S', 'ş' => 's', 'Š' => 'S', 'š' => 's', 'ſ' => 's', 'Ţ' => 'T', 'ţ' => 't', 'Ť' => 'T', 'ť' => 't', 'Ŧ' => 'T', 'ŧ' => 't', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'Ũ' => 'U', 'ũ' => 'u', 'Ū' => 'U', 'ū' => 'u', 'Ŭ' => 'U', 'ŭ' => 'u', 'Ů' => 'U', 'ů' => 'u', 'Ű' => 'U', 'ű' => 'u', 'Ų' => 'U', 'ų' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ý' => 'Y', 'ý' => 'y', 'ÿ' => 'y', 'Ŷ' => 'Y', 'ŷ' => 'y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'ź' => 'z', 'Ż' => 'Z', 'ż' => 'z', 'Ž' => 'Z', 'ž' => 'z');
              return strtr($str, $accents);
          }
          

          另外,您将解码/编码保存在 UTF-8 部分中。

          【讨论】:

            【解决方案15】:
            $unwanted_array = array(    '&amp;' => 'and', '&' => 'and', '@' => 'at', '©' => 'c', '®' => 'r', 
            '̊'=>'','̧'=>'','̨'=>'','̄'=>'','̱'=>'',
            'Á'=>'a','á'=>'a','À'=>'a','à'=>'a','Ă'=>'a','ă'=>'a','ắ'=>'a','Ắ'=>'A','Ằ'=>'A',
            'ằ'=>'a','ẵ'=>'a','Ẵ'=>'A','ẳ'=>'a','Ẳ'=>'A','Â'=>'a','â'=>'a','ấ'=>'a','Ấ'=>'A',
            'ầ'=>'a','Ầ'=>'a','ẩ'=>'a','Ẩ'=>'A','Ǎ'=>'a','ǎ'=>'a','Å'=>'a','å'=>'a','Ǻ'=>'a',
            'ǻ'=>'a','Ä'=>'a','ä'=>'a','ã'=>'a','Ã'=>'A','Ą'=>'a','ą'=>'a','Ā'=>'a','ā'=>'a',
            'ả'=>'a','Ả'=>'a','Ạ'=>'A','ạ'=>'a','ặ'=>'a','Ặ'=>'A','ậ'=>'a','Ậ'=>'A','Æ'=>'ae',
            'æ'=>'ae','Ǽ'=>'ae','ǽ'=>'ae','ẫ'=>'a','Ẫ'=>'A',
            'Ć'=>'c','ć'=>'c','Ĉ'=>'c','ĉ'=>'c','Č'=>'c','č'=>'c','Ċ'=>'c','ċ'=>'c','Ç'=>'c','ç'=>'c',
            'Ď'=>'d','ď'=>'d','Ḑ'=>'D','ḑ'=>'d','Đ'=>'d','đ'=>'d','Ḍ'=>'D','ḍ'=>'d','Ḏ'=>'D','ḏ'=>'d','ð'=>'d','Ð'=>'D',
            'É'=>'e','é'=>'e','È'=>'e','è'=>'e','Ĕ'=>'e','ĕ'=>'e','ê'=>'e','ế'=>'e','Ế'=>'E','ề'=>'e',
            'Ề'=>'E','Ě'=>'e','ě'=>'e','Ë'=>'e','ë'=>'e','Ė'=>'e','ė'=>'e','Ę'=>'e','ę'=>'e','Ē'=>'e',
            'ē'=>'e','ệ'=>'e','Ệ'=>'E','Ə'=>'e','ə'=>'e','ẽ'=>'e','Ẽ'=>'E','ễ'=>'e',
            'Ễ'=>'E','ể'=>'e','Ể'=>'E','ẻ'=>'e','Ẻ'=>'E','ẹ'=>'e','Ẹ'=>'E',
            'ƒ'=>'f',
            'Ğ'=>'g','ğ'=>'g','Ĝ'=>'g','ĝ'=>'g','Ǧ'=>'G','ǧ'=>'g','Ġ'=>'g','ġ'=>'g','Ģ'=>'g','ģ'=>'g',
            'H̲'=>'H','h̲'=>'h','Ĥ'=>'h','ĥ'=>'h','Ȟ'=>'H','ȟ'=>'h','Ḩ'=>'H','ḩ'=>'h','Ħ'=>'h','ħ'=>'h','Ḥ'=>'H','ḥ'=>'h',
            'Ỉ'=>'I','Í'=>'i','í'=>'i','Ì'=>'i','ì'=>'i','Ĭ'=>'i','ĭ'=>'i','Î'=>'i','î'=>'i','Ǐ'=>'i','ǐ'=>'i',
            'Ï'=>'i','ï'=>'i','Ḯ'=>'I','ḯ'=>'i','Ĩ'=>'i','ĩ'=>'i','İ'=>'i','Į'=>'i','į'=>'i','Ī'=>'i','ī'=>'i',
            'ỉ'=>'I','Ị'=>'I','ị'=>'i','IJ'=>'ij','ij'=>'ij','ı'=>'i',
            'Ĵ'=>'j','ĵ'=>'j',
            'Ķ'=>'k','ķ'=>'k','Ḵ'=>'K','ḵ'=>'k',
            'Ĺ'=>'l','ĺ'=>'l','Ľ'=>'l','ľ'=>'l','Ļ'=>'l','ļ'=>'l','Ł'=>'l','ł'=>'l','Ŀ'=>'l','ŀ'=>'l',
            'Ń'=>'n','ń'=>'n','Ň'=>'n','ň'=>'n','Ñ'=>'N','ñ'=>'n','Ņ'=>'n','ņ'=>'n','Ṇ'=>'N','ṇ'=>'n','Ŋ'=>'n','ŋ'=>'n',
            'Ó'=>'o','ó'=>'o','Ò'=>'o','ò'=>'o','Ŏ'=>'o','ŏ'=>'o','Ô'=>'o','ô'=>'o','ố'=>'o','Ố'=>'O','ồ'=>'o',
            'Ồ'=>'O','ổ'=>'o','Ổ'=>'O','Ǒ'=>'o','ǒ'=>'o','Ö'=>'o','ö'=>'o','Ő'=>'o','ő'=>'o','Õ'=>'o','õ'=>'o',
            'Ø'=>'o','ø'=>'o','Ǿ'=>'o','ǿ'=>'o','Ǫ'=>'O','ǫ'=>'o','Ǭ'=>'O','ǭ'=>'o','Ō'=>'o','ō'=>'o','ỏ'=>'o',
            'Ỏ'=>'O','Ơ'=>'o','ơ'=>'o','ớ'=>'o','Ớ'=>'O','ờ'=>'o','Ờ'=>'O','ở'=>'o','Ở'=>'O','ợ'=>'o','Ợ'=>'O',
            'ọ'=>'o','Ọ'=>'O','ọ'=>'o','Ọ'=>'O','ộ'=>'o','Ộ'=>'O','ỗ'=>'o','Ỗ'=>'O','ỡ'=>'o','Ỡ'=>'O',
            'Œ'=>'oe','œ'=>'oe',
            'ĸ'=>'k',
            'Ŕ'=>'r','ŕ'=>'r','Ř'=>'r','ř'=>'r','ṙ'=>'r','Ŗ'=>'r','ŗ'=>'r','Ṛ'=>'R','ṛ'=>'r','Ṟ'=>'R','ṟ'=>'r',
            'S̲'=>'S','s̲'=>'s','Ś'=>'s','ś'=>'s','Ŝ'=>'s','ŝ'=>'s','Š'=>'s','š'=>'s','Ş'=>'s','ş'=>'s',
            'Ṣ'=>'S','ṣ'=>'s','Ș'=>'S','ș'=>'s',
            'ſ'=>'z','ß'=>'ss','Ť'=>'t','ť'=>'t','Ţ'=>'t','ţ'=>'t','Ṭ'=>'T','ṭ'=>'t','Ț'=>'T',
            'ț'=>'t','Ṯ'=>'T','ṯ'=>'t','™'=>'tm','Ŧ'=>'t','ŧ'=>'t',
            'Ú'=>'u','ú'=>'u','Ù'=>'u','ù'=>'u','Ŭ'=>'u','ŭ'=>'u','Û'=>'u','û'=>'u','Ǔ'=>'u','ǔ'=>'u','Ů'=>'u','ů'=>'u',
            'Ü'=>'u','ü'=>'u','Ǘ'=>'u','ǘ'=>'u','Ǜ'=>'u','ǜ'=>'u','Ǚ'=>'u','ǚ'=>'u','Ǖ'=>'u','ǖ'=>'u','Ű'=>'u','ű'=>'u',
            'Ũ'=>'u','ũ'=>'u','Ų'=>'u','ų'=>'u','Ū'=>'u','ū'=>'u','Ư'=>'u','ư'=>'u','ứ'=>'u','Ứ'=>'U','ừ'=>'u','Ừ'=>'U',
            'ử'=>'u','Ử'=>'U','ự'=>'u','Ự'=>'U','ụ'=>'u','Ụ'=>'U','ủ'=>'u','Ủ'=>'U','ữ'=>'u','Ữ'=>'U',
            'Ŵ'=>'w','ŵ'=>'w',
            'Ý'=>'y','ý'=>'y','ỳ'=>'y','Ỳ'=>'Y','Ŷ'=>'y','ŷ'=>'y','ÿ'=>'y','Ÿ'=>'y','ỹ'=>'y','Ỹ'=>'Y','ỷ'=>'y','Ỷ'=>'Y',
            'Z̲'=>'Z','z̲'=>'z','Ź'=>'z','ź'=>'z','Ž'=>'z','ž'=>'z','Ż'=>'z','ż'=>'z','Ẕ'=>'Z','ẕ'=>'z',
            'þ'=>'p','ʼn'=>'n','А'=>'a','а'=>'a','Б'=>'b','б'=>'b','В'=>'v','в'=>'v','Г'=>'g','г'=>'g','Ґ'=>'g','ґ'=>'g',
            'Д'=>'d','д'=>'d','Е'=>'e','е'=>'e','Ё'=>'jo','ё'=>'jo','Є'=>'e','є'=>'e','Ж'=>'zh','ж'=>'zh','З'=>'z','з'=>'z',
            'И'=>'i','и'=>'i','І'=>'i','і'=>'i','Ї'=>'i','ї'=>'i','Й'=>'j','й'=>'j','К'=>'k','к'=>'k','Л'=>'l','л'=>'l',
            'М'=>'m','м'=>'m','Н'=>'n','н'=>'n','О'=>'o','о'=>'o','П'=>'p','п'=>'p','Р'=>'r','р'=>'r','С'=>'s','с'=>'s',
            'Т'=>'t','т'=>'t','У'=>'u','у'=>'u','Ф'=>'f','ф'=>'f','Х'=>'h','х'=>'h','Ц'=>'c','ц'=>'c','Ч'=>'ch','ч'=>'ch',
            'Ш'=>'sh','ш'=>'sh','Щ'=>'sch','щ'=>'sch','Ъ'=>'-',
            'ъ'=>'-','Ы'=>'y','ы'=>'y','Ь'=>'-','ь'=>'-',
            'Э'=>'je','э'=>'je','Ю'=>'ju','ю'=>'ju','Я'=>'ja','я'=>'ja','א'=>'a','ב'=>'b','ג'=>'g','ד'=>'d','ה'=>'h','ו'=>'v',
            'ז'=>'z','ח'=>'h','ט'=>'t','י'=>'i','ך'=>'k','כ'=>'k','ל'=>'l','ם'=>'m','מ'=>'m','ן'=>'n','נ'=>'n','ס'=>'s','ע'=>'e',
            'ף'=>'p','פ'=>'p','ץ'=>'C','צ'=>'c','ק'=>'q','ר'=>'r','ש'=>'w','ת'=>'t'
            );
            
            $accentsRemoved = strtr( $stringToRemoveAccents , $unwanted_array );
            

            【讨论】:

            • 为什么这会比这个旧问题中的另一个公认答案有所改善或更好的解决方案?
            • Diego Castillo 回答了这个问题:cubiq.org/the-perfect-php-clean-url-generator 而且更好
            • 这是唯一包含所有口音的答案。大多数其他答案甚至不包含在欧洲语言中很常见的 č
            【解决方案16】:

            remove_accents() 函数根据上一版本Wordpress 4.3 formatting 的改进版本是:

            function mbstring_binary_safe_encoding( $reset = false ) {
                static $encodings = array();
                static $overloaded = null;
            
                if ( is_null( $overloaded ) )
                    $overloaded = function_exists( 'mb_internal_encoding' ) && ( ini_get( 'mbstring.func_overload' ) & 2 );
            
                if ( false === $overloaded )
                    return;
            
                if ( ! $reset ) {
                    $encoding = mb_internal_encoding();
                    array_push( $encodings, $encoding );
                    mb_internal_encoding( 'ISO-8859-1' );
                }
            
                if ( $reset && $encodings ) {
                    $encoding = array_pop( $encodings );
                    mb_internal_encoding( $encoding );
                }
            }
            
            function reset_mbstring_encoding() {
                mbstring_binary_safe_encoding( true );
            }
            
            function seems_utf8( $str ) {
                mbstring_binary_safe_encoding();
                $length = strlen($str);
                reset_mbstring_encoding();
                for ($i=0; $i < $length; $i++) {
                    $c = ord($str[$i]);
                    if ($c < 0x80) $n = 0; // 0bbbbbbb
                    elseif (($c & 0xE0) == 0xC0) $n=1; // 110bbbbb
                    elseif (($c & 0xF0) == 0xE0) $n=2; // 1110bbbb
                    elseif (($c & 0xF8) == 0xF0) $n=3; // 11110bbb
                    elseif (($c & 0xFC) == 0xF8) $n=4; // 111110bb
                    elseif (($c & 0xFE) == 0xFC) $n=5; // 1111110b
                    else return false; // Does not match any model
                    for ($j=0; $j<$n; $j++) { // n bytes matching 10bbbbbb follow ?
                        if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))
                            return false;
                    }
                }
                return true;
            }
            
            function remove_accents( $string ) {
                if ( !preg_match('/[\x80-\xff]/', $string) )
                    return $string;
            
                if (seems_utf8($string)) {
                    $chars = array(
                        // Decompositions for Latin-1 Supplement
                        chr(194).chr(170) => 'a', chr(194).chr(186) => 'o',
                        chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
                        chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
                        chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
                        chr(195).chr(134) => 'AE',chr(195).chr(135) => 'C',
                        chr(195).chr(136) => 'E', chr(195).chr(137) => 'E',
                        chr(195).chr(138) => 'E', chr(195).chr(139) => 'E',
                        chr(195).chr(140) => 'I', chr(195).chr(141) => 'I',
                        chr(195).chr(142) => 'I', chr(195).chr(143) => 'I',
                        chr(195).chr(144) => 'D', chr(195).chr(145) => 'N',
                        chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
                        chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
                        chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
                        chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
                        chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
                        chr(195).chr(158) => 'TH',chr(195).chr(159) => 's',
                        chr(195).chr(160) => 'a', chr(195).chr(161) => 'a',
                        chr(195).chr(162) => 'a', chr(195).chr(163) => 'a',
                        chr(195).chr(164) => 'a', chr(195).chr(165) => 'a',
                        chr(195).chr(166) => 'ae',chr(195).chr(167) => 'c',
                        chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
                        chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
                        chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
                        chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
                        chr(195).chr(176) => 'd', chr(195).chr(177) => 'n',
                        chr(195).chr(178) => 'o', chr(195).chr(179) => 'o',
                        chr(195).chr(180) => 'o', chr(195).chr(181) => 'o',
                        chr(195).chr(182) => 'o', chr(195).chr(184) => 'o',
                        chr(195).chr(185) => 'u', chr(195).chr(186) => 'u',
                        chr(195).chr(187) => 'u', chr(195).chr(188) => 'u',
                        chr(195).chr(189) => 'y', chr(195).chr(190) => 'th',
                        chr(195).chr(191) => 'y', chr(195).chr(152) => 'O',
                        // Decompositions for Latin Extended-A
                        chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
                        chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
                        chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
                        chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
                        chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
                        chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
                        chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
                        chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
                        chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
                        chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
                        chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
                        chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
                        chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
                        chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
                        chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
                        chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
                        chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
                        chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
                        chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
                        chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
                        chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
                        chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
                        chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
                        chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
                        chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
                        chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
                        chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
                        chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
                        chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
                        chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
                        chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
                        chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
                        chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
                        chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
                        chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
                        chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
                        chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
                        chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
                        chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
                        chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
                        chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
                        chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
                        chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
                        chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
                        chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
                        chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
                        chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
                        chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
                        chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
                        chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
                        chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
                        chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
                        chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
                        chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
                        chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
                        chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
                        chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
                        chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
                        chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
                        chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
                        chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
                        chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
                        chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
                        chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
                        // Decompositions for Latin Extended-B
                        chr(200).chr(152) => 'S', chr(200).chr(153) => 's',
                        chr(200).chr(154) => 'T', chr(200).chr(155) => 't',
                        // Euro Sign
                        chr(226).chr(130).chr(172) => 'E',
                        // GBP (Pound) Sign
                        chr(194).chr(163) => '',
                        // Vowels with diacritic (Vietnamese)
                        // unmarked
                        chr(198).chr(160) => 'O', chr(198).chr(161) => 'o',
                        chr(198).chr(175) => 'U', chr(198).chr(176) => 'u',
                        // grave accent
                        chr(225).chr(186).chr(166) => 'A', chr(225).chr(186).chr(167) => 'a',
                        chr(225).chr(186).chr(176) => 'A', chr(225).chr(186).chr(177) => 'a',
                        chr(225).chr(187).chr(128) => 'E', chr(225).chr(187).chr(129) => 'e',
                        chr(225).chr(187).chr(146) => 'O', chr(225).chr(187).chr(147) => 'o',
                        chr(225).chr(187).chr(156) => 'O', chr(225).chr(187).chr(157) => 'o',
                        chr(225).chr(187).chr(170) => 'U', chr(225).chr(187).chr(171) => 'u',
                        chr(225).chr(187).chr(178) => 'Y', chr(225).chr(187).chr(179) => 'y',
                        // hook
                        chr(225).chr(186).chr(162) => 'A', chr(225).chr(186).chr(163) => 'a',
                        chr(225).chr(186).chr(168) => 'A', chr(225).chr(186).chr(169) => 'a',
                        chr(225).chr(186).chr(178) => 'A', chr(225).chr(186).chr(179) => 'a',
                        chr(225).chr(186).chr(186) => 'E', chr(225).chr(186).chr(187) => 'e',
                        chr(225).chr(187).chr(130) => 'E', chr(225).chr(187).chr(131) => 'e',
                        chr(225).chr(187).chr(136) => 'I', chr(225).chr(187).chr(137) => 'i',
                        chr(225).chr(187).chr(142) => 'O', chr(225).chr(187).chr(143) => 'o',
                        chr(225).chr(187).chr(148) => 'O', chr(225).chr(187).chr(149) => 'o',
                        chr(225).chr(187).chr(158) => 'O', chr(225).chr(187).chr(159) => 'o',
                        chr(225).chr(187).chr(166) => 'U', chr(225).chr(187).chr(167) => 'u',
                        chr(225).chr(187).chr(172) => 'U', chr(225).chr(187).chr(173) => 'u',
                        chr(225).chr(187).chr(182) => 'Y', chr(225).chr(187).chr(183) => 'y',
                        // tilde
                        chr(225).chr(186).chr(170) => 'A', chr(225).chr(186).chr(171) => 'a',
                        chr(225).chr(186).chr(180) => 'A', chr(225).chr(186).chr(181) => 'a',
                        chr(225).chr(186).chr(188) => 'E', chr(225).chr(186).chr(189) => 'e',
                        chr(225).chr(187).chr(132) => 'E', chr(225).chr(187).chr(133) => 'e',
                        chr(225).chr(187).chr(150) => 'O', chr(225).chr(187).chr(151) => 'o',
                        chr(225).chr(187).chr(160) => 'O', chr(225).chr(187).chr(161) => 'o',
                        chr(225).chr(187).chr(174) => 'U', chr(225).chr(187).chr(175) => 'u',
                        chr(225).chr(187).chr(184) => 'Y', chr(225).chr(187).chr(185) => 'y',
                        // acute accent
                        chr(225).chr(186).chr(164) => 'A', chr(225).chr(186).chr(165) => 'a',
                        chr(225).chr(186).chr(174) => 'A', chr(225).chr(186).chr(175) => 'a',
                        chr(225).chr(186).chr(190) => 'E', chr(225).chr(186).chr(191) => 'e',
                        chr(225).chr(187).chr(144) => 'O', chr(225).chr(187).chr(145) => 'o',
                        chr(225).chr(187).chr(154) => 'O', chr(225).chr(187).chr(155) => 'o',
                        chr(225).chr(187).chr(168) => 'U', chr(225).chr(187).chr(169) => 'u',
                        // dot below
                        chr(225).chr(186).chr(160) => 'A', chr(225).chr(186).chr(161) => 'a',
                        chr(225).chr(186).chr(172) => 'A', chr(225).chr(186).chr(173) => 'a',
                        chr(225).chr(186).chr(182) => 'A', chr(225).chr(186).chr(183) => 'a',
                        chr(225).chr(186).chr(184) => 'E', chr(225).chr(186).chr(185) => 'e',
                        chr(225).chr(187).chr(134) => 'E', chr(225).chr(187).chr(135) => 'e',
                        chr(225).chr(187).chr(138) => 'I', chr(225).chr(187).chr(139) => 'i',
                        chr(225).chr(187).chr(140) => 'O', chr(225).chr(187).chr(141) => 'o',
                        chr(225).chr(187).chr(152) => 'O', chr(225).chr(187).chr(153) => 'o',
                        chr(225).chr(187).chr(162) => 'O', chr(225).chr(187).chr(163) => 'o',
                        chr(225).chr(187).chr(164) => 'U', chr(225).chr(187).chr(165) => 'u',
                        chr(225).chr(187).chr(176) => 'U', chr(225).chr(187).chr(177) => 'u',
                        chr(225).chr(187).chr(180) => 'Y', chr(225).chr(187).chr(181) => 'y',
                        // Vowels with diacritic (Chinese, Hanyu Pinyin)
                        chr(201).chr(145) => 'a',
                        // macron
                        chr(199).chr(149) => 'U', chr(199).chr(150) => 'u',
                        // acute accent
                        chr(199).chr(151) => 'U', chr(199).chr(152) => 'u',
                        // caron
                        chr(199).chr(141) => 'A', chr(199).chr(142) => 'a',
                        chr(199).chr(143) => 'I', chr(199).chr(144) => 'i',
                        chr(199).chr(145) => 'O', chr(199).chr(146) => 'o',
                        chr(199).chr(147) => 'U', chr(199).chr(148) => 'u',
                        chr(199).chr(153) => 'U', chr(199).chr(154) => 'u',
                        // grave accent
                        chr(199).chr(155) => 'U', chr(199).chr(156) => 'u',
                    );
            
                    $string = strtr($string, $chars);
                } else {
                    $chars = array();
                    // Assume ISO-8859-1 if not UTF-8
                    $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
                        .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
                        .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
                        .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
                        .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
                        .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
                        .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
                        .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
                        .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
                        .chr(252).chr(253).chr(255);
            
                    $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
            
                    $string = strtr($string, $chars['in'], $chars['out']);
                    $double_chars = array();
                    $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
                    $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
                    $string = str_replace($double_chars['in'], $double_chars['out'], $string);
                }
            
                return $string;
            }
            

            我的回答是更新@dynamic solution,因为罗马尼亚语或其他语言的变音符号没有被转换。我编写了最少的函数,并且像一个魅力一样工作。

            print_r(remove_accents('Iași, Iași County, Romania'));
            

            【讨论】:

              【解决方案17】:

              这里有一个简单的函数,我通常用它来去除重音:

              function str_without_accents($str, $charset='utf-8')
              {
                  $str = htmlentities($str, ENT_NOQUOTES, $charset);
              
                  $str = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
                  $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
                  $str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
              
                  return $str;   // or add this : mb_strtoupper($str); for uppercase :)
              }
              

              【讨论】:

              • 这似乎不太适合未来。如果将来分配了更多的 HTML 实体,那么它们可能会巧合地匹配您的正则表达式(例如,很多单词以“ring”结尾)。
              【解决方案18】:
              <?php
              /* 
               * Thanks:
               *   - The idea of extracting accents equiv chars with the help of the HTMLSpecialChars convertion was taking from ICanBoogie Package of 'Olivier Laviale' {@link http://www.weirdog.com/blog/php/supprimer-les-accents-des-caracteres-accentues.html}
              */
              function accentCharsModifier($str){
                  if(($length=mb_strlen($str,"UTF-8"))<strlen($str)){
                      $i=$count=0;
                      while($i<$length){
                          if(strlen($c=mb_substr($str,$i,1,"UTF-8"))>1){
                              $he=htmlentities($c); 
                              if(($nC=preg_replace("#&([A-Za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#", "\\1", $he))!=$he ||
                                  ($nC=preg_replace("#&([A-Za-z]{2})(?:lig);#", "\\1", $he))!=$he ||
                                  ($nC=preg_replace("#&[^;]+;#", "", $he))!=$he){
                                  $str=str_replace($c,$nC,$str,$count);if($nC==""){$length=$length-$count;$i--;}
                              }
                          }
                          $i++;
                      }
                  }
                  return $str;
              }
              echo accentCharsModifier("&éôpkAÈû");
              ?>
              

              【讨论】:

                【解决方案19】:

                我刚刚创建了一个 removeAccents 方法,该方法基于对这个线程和另一个线程 (How to remove accents and turn letters into "plain" ASCII characters?) 的阅读。

                方法在这里:https://github.com/lingtalfi/Bat/blob/master/StringTool.md#removeaccents

                测试在这里:https://github.com/lingtalfi/Bat/blob/master/btests/StringTool/removeAccents/stringTool.removeAccents.test.php,

                这是迄今为止测试的内容:

                $a = [
                    // easy
                    '',
                    'a',
                    'après',
                    'dédé fait la fête ?',
                    // hard
                    'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
                    'ŻŹĆŃĄŚŁĘÓżźćńąśłęó',
                    'qqqqŻŹĆŃĄŚŁĘÓżźćńąśłęóqqq',
                    'ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöøùúûüýÿ',       
                    'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ',
                    'ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİĴĵĶķ',
                    'ĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽž',
                    'ſƒƠơƯưǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǺǻǾǿ',
                    'Ǽǽ',
                ];
                

                它只转换强调的东西(字母/连字/cédilles/一些字母通过/...?)。

                这里是方法的内容:(https://github.com/lingtalfi/Bat/blob/master/StringTool.php#L83)

                public static function removeAccents($str)
                {
                    static $map = [
                        // single letters
                        'à' => 'a',
                        'á' => 'a',
                        'â' => 'a',
                        'ã' => 'a',
                        'ä' => 'a',
                        'ą' => 'a',
                        'å' => 'a',
                        'ā' => 'a',
                        'ă' => 'a',
                        'ǎ' => 'a',
                        'ǻ' => 'a',
                        'À' => 'A',
                        'Á' => 'A',
                        'Â' => 'A',
                        'Ã' => 'A',
                        'Ä' => 'A',
                        'Ą' => 'A',
                        'Å' => 'A',
                        'Ā' => 'A',
                        'Ă' => 'A',
                        'Ǎ' => 'A',
                        'Ǻ' => 'A',
                
                
                        'ç' => 'c',
                        'ć' => 'c',
                        'ĉ' => 'c',
                        'ċ' => 'c',
                        'č' => 'c',
                        'Ç' => 'C',
                        'Ć' => 'C',
                        'Ĉ' => 'C',
                        'Ċ' => 'C',
                        'Č' => 'C',
                
                        'ď' => 'd',
                        'đ' => 'd',
                        'Ð' => 'D',
                        'Ď' => 'D',
                        'Đ' => 'D',
                
                
                        'è' => 'e',
                        'é' => 'e',
                        'ê' => 'e',
                        'ë' => 'e',
                        'ę' => 'e',
                        'ē' => 'e',
                        'ĕ' => 'e',
                        'ė' => 'e',
                        'ě' => 'e',
                        'È' => 'E',
                        'É' => 'E',
                        'Ê' => 'E',
                        'Ë' => 'E',
                        'Ę' => 'E',
                        'Ē' => 'E',
                        'Ĕ' => 'E',
                        'Ė' => 'E',
                        'Ě' => 'E',
                
                        'ƒ' => 'f',
                
                
                        'ĝ' => 'g',
                        'ğ' => 'g',
                        'ġ' => 'g',
                        'ģ' => 'g',
                        'Ĝ' => 'G',
                        'Ğ' => 'G',
                        'Ġ' => 'G',
                        'Ģ' => 'G',
                
                
                        'ĥ' => 'h',
                        'ħ' => 'h',
                        'Ĥ' => 'H',
                        'Ħ' => 'H',
                
                        'ì' => 'i',
                        'í' => 'i',
                        'î' => 'i',
                        'ï' => 'i',
                        'ĩ' => 'i',
                        'ī' => 'i',
                        'ĭ' => 'i',
                        'į' => 'i',
                        'ſ' => 'i',
                        'ǐ' => 'i',
                        'Ì' => 'I',
                        'Í' => 'I',
                        'Î' => 'I',
                        'Ï' => 'I',
                        'Ĩ' => 'I',
                        'Ī' => 'I',
                        'Ĭ' => 'I',
                        'Į' => 'I',
                        'İ' => 'I',
                        'Ǐ' => 'I',
                
                        'ĵ' => 'j',
                        'Ĵ' => 'J',
                
                        'ķ' => 'k',
                        'Ķ' => 'K',
                
                
                        'ł' => 'l',
                        'ĺ' => 'l',
                        'ļ' => 'l',
                        'ľ' => 'l',
                        'ŀ' => 'l',
                        'Ł' => 'L',
                        'Ĺ' => 'L',
                        'Ļ' => 'L',
                        'Ľ' => 'L',
                        'Ŀ' => 'L',
                
                
                        'ñ' => 'n',
                        'ń' => 'n',
                        'ņ' => 'n',
                        'ň' => 'n',
                        'ʼn' => 'n',
                        'Ñ' => 'N',
                        'Ń' => 'N',
                        'Ņ' => 'N',
                        'Ň' => 'N',
                
                        'ò' => 'o',
                        'ó' => 'o',
                        'ô' => 'o',
                        'õ' => 'o',
                        'ö' => 'o',
                        'ð' => 'o',
                        'ø' => 'o',
                        'ō' => 'o',
                        'ŏ' => 'o',
                        'ő' => 'o',
                        'ơ' => 'o',
                        'ǒ' => 'o',
                        'ǿ' => 'o',
                        'Ò' => 'O',
                        'Ó' => 'O',
                        'Ô' => 'O',
                        'Õ' => 'O',
                        'Ö' => 'O',
                        'Ø' => 'O',
                        'Ō' => 'O',
                        'Ŏ' => 'O',
                        'Ő' => 'O',
                        'Ơ' => 'O',
                        'Ǒ' => 'O',
                        'Ǿ' => 'O',
                
                
                        'ŕ' => 'r',
                        'ŗ' => 'r',
                        'ř' => 'r',
                        'Ŕ' => 'R',
                        'Ŗ' => 'R',
                        'Ř' => 'R',
                
                
                        'ś' => 's',
                        'š' => 's',
                        'ŝ' => 's',
                        'ş' => 's',
                        'Ś' => 'S',
                        'Š' => 'S',
                        'Ŝ' => 'S',
                        'Ş' => 'S',
                
                        'ţ' => 't',
                        'ť' => 't',
                        'ŧ' => 't',
                        'Ţ' => 'T',
                        'Ť' => 'T',
                        'Ŧ' => 'T',
                
                
                        'ù' => 'u',
                        'ú' => 'u',
                        'û' => 'u',
                        'ü' => 'u',
                        'ũ' => 'u',
                        'ū' => 'u',
                        'ŭ' => 'u',
                        'ů' => 'u',
                        'ű' => 'u',
                        'ų' => 'u',
                        'ư' => 'u',
                        'ǔ' => 'u',
                        'ǖ' => 'u',
                        'ǘ' => 'u',
                        'ǚ' => 'u',
                        'ǜ' => 'u',
                        'Ù' => 'U',
                        'Ú' => 'U',
                        'Û' => 'U',
                        'Ü' => 'U',
                        'Ũ' => 'U',
                        'Ū' => 'U',
                        'Ŭ' => 'U',
                        'Ů' => 'U',
                        'Ű' => 'U',
                        'Ų' => 'U',
                        'Ư' => 'U',
                        'Ǔ' => 'U',
                        'Ǖ' => 'U',
                        'Ǘ' => 'U',
                        'Ǚ' => 'U',
                        'Ǜ' => 'U',
                
                
                        'ŵ' => 'w',
                        'Ŵ' => 'W',
                
                        'ý' => 'y',
                        'ÿ' => 'y',
                        'ŷ' => 'y',
                        'Ý' => 'Y',
                        'Ÿ' => 'Y',
                        'Ŷ' => 'Y',
                
                        'ż' => 'z',
                        'ź' => 'z',
                        'ž' => 'z',
                        'Ż' => 'Z',
                        'Ź' => 'Z',
                        'Ž' => 'Z',
                
                
                        // accentuated ligatures
                        'Ǽ' => 'A',
                        'ǽ' => 'a',
                    ];
                    return strtr($str, $map);
                }
                

                【讨论】:

                  【解决方案20】:

                  如果您有 http://php.net/manual/en/book.intl.php 可用,这解决了您的问题

                  $string = "Fóø Bår";
                  $transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
                  echo $normalized = $transliterator->transliterate($string);
                  

                  【讨论】:

                  • Lower() 在这种情况下不需要
                  • 这些链接可能有助于弄清楚规则以及 NFD 和 NFC 的含义:ICU User guideUnicode Norm Forms
                  • 我已经阅读了这个页面十几次,直到今天我还是错过了这个完美的答案!
                  • 不敢相信最受欢迎的答案是关于硬编码字符映射的。 应该是公认的答案。
                  • 这个答案让我找到了适合我需求的解决方案。这里的规则太强了,我只用那些规则去除重音':: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;'
                  【解决方案21】:

                  根据@Mimouni 的回答,我制作了这个函数来将重音字符串转写为非重音字符串。

                  /**
                   * @param $str Convert string to lowercase and replace special chars to equivalents ou remove its
                   * @return string
                   */
                  function _slugify(string $string): string
                  {
                      $str = $string; // for comparisons
                      $str = _toUtf8($str); // Force to work with string in UTF-8
                      $str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
                  
                      if ($str != htmlentities($string, ENT_QUOTES, 'UTF-8')) { // iconv fails
                          $str = _toUtf8($string);
                          $str = htmlentities($str, ENT_QUOTES, 'UTF-8');
                          $str = preg_replace('#&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);#i', '$1', $str);
                          // Need to strip non ASCII chars or any other than a-z, A-Z, 0-9...
                          $str = html_entity_decode($str, ENT_QUOTES, 'UTF-8');
                          $str = preg_replace(array('#[^0-9a-z]#i', '#[ -]+#'), ' ', $str);
                          $str = trim($str, ' -');
                      }
                  
                      // lowercase
                      $string = strtolower($str);
                  
                      return $string;
                  }
                  

                  为了将字符串转换为 UTF-8,我在这里使用了多字节字符串扩展。 请注意,我将字符串分段以避免混合内容的麻烦(我有这种情况)并逐字转换。

                  /**
                   * @param $str string String in any encoding
                   * @return string
                   */
                  function _toUtf8(string $str_in): ?string
                  {
                      if (!function_exists('mb_detect_encoding')) {
                          throw new \Exception('The Multi Byte String extension is absent!');
                      }
                      $str_out = [];
                      $words = explode(" ", $str_in);
                      foreach ($words as $word) {
                          $current_encoding = mb_detect_encoding($word, 'UTF-8, ASCII, ISO-8859-1');
                          $str_out[] = mb_convert_encoding($word, 'UTF-8', $current_encoding);
                      }
                      return implode(" ", $str_out);
                  }
                  

                  页脚注释:是在 Windows 命令行中传递 PHPUnit UnitTests 的唯一解决方案(语言环境问题) @gabo 解决方案应该可以工作,但不幸的是不适合我

                  【讨论】:

                    【解决方案22】:

                    在 laravel 中你可以简单地使用 str_slug($accentedPhrase) 如果你关心破折号(-)这个方法用空格代替你可以使用str_replace('-', ' ', str_slug($accentedPhrase))

                    【讨论】:

                    • 你不需要使用replace,你可以设置第二个参数为空字符串str_slug($word, ' ');
                    【解决方案23】:

                    这样的?

                    $arrSearch  = explode(","," ,ç,æ, œ, á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u");
                    
                    $arrReplace = explode(",","_,c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u");
                    
                    $output = str_replace($arrSearch, $arrReplace, $input);
                    

                    【讨论】:

                      【解决方案24】:

                      如果主要任务只是在 URL 中使用字符串,为什么不使用slugyfier

                      composer require cocur/slugify
                      

                      然后

                      use Cocur\Slugify\Slugify;
                      
                      $slugify = new Slugify();
                      echo $slugify->slugify('Fóø Bår');
                      

                      它还为流行的框架提供了许多桥梁。例如。您可以使用 Doctrine Extensions Sluggable 行为为 DB 中的每个实体自动生成唯一的 slug 并在 URL 中使用它。

                      如果您只想消除所有重音,可以使用rulesets 来满足要求。

                      【讨论】:

                        【解决方案25】:

                        这个有什么问题吗?适用于 UTF8

                        function strip_accents($s){
                          return str_replace(
                            explode(' ', preg_replace('/ +/', ' ', 'č ć ž š đ  Č Ć Ž Š Đ  à á â ã ä ç è é ê ë ì í î ï ñ ò ó ô õ ö ù ú û ü ý ÿ À Á Â Ã Ä Ç È É Ê Ë Ì Í Î Ï Ñ Ò Ó Ô Õ Ö Ù Ú Û Ü Ý')),
                            explode(' ', preg_replace('/ +/', ' ', 'c c z s dj C C Z S DJ a a a a a c e e e e i i i i n o o o o o u u u u y y A A A A A C E E E E I I I I N O O O O O U U U U Y')),
                            $s);
                        }
                        

                        不使用preg_replace 可以更快,但速度不是我的目标。

                        【讨论】:

                          【解决方案26】:

                          这个答案我在这里有以下提示,所以它不是我的。它适用于我使用 LATIN1 或 UTF-8。如果您使用其他字符集,您可能应该将它们添加到 mb_detect_encoding 函数中。可能还需要正确的环境设置。

                          function NoAccents($s){
                                  return iconv(mb_detect_encoding($s,'UTF-8, ASCII, ISO-8859-1'),'ASCII//TRANSLIT//INGORE',$s);
                          }
                          

                          【讨论】:

                          • 对于Fóø Bår,我实际上只得到了Fo? Bar。无法将 ø 字符转换为 o。尝试将我的环境更改为 no_NO, da_DK,但它没有干扰。使用setlocale(LC_CTYPE,'da_DK') 我有Fo? Baar
                          【解决方案27】:

                          结合部分答案:

                          /**
                           * Given an utf8 string, returns an ascii string.
                           * Only supports ISO-8859-1 chars, not chars like č, œ, Œ, ř, Š, š, ů, Ÿ or ž
                           * @param string $utf8
                           * @return string ascii
                           */
                          function stripAccents(string $utf8): string
                          {
                              $src = 'àáâãäåçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ';
                              $dst = 'aaaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY';
                              $iso8859_1 = strtr(
                                  utf8_decode($utf8),
                                  utf8_decode($src),
                                  $dst
                              );
                              // iconv below not used for UTF-8 directly because it adds chars like ^'"`
                              // which are nice to not lose info, but not very readable and not compatible with filenames
                              // iconv() additionally converts chars like
                              // ¡ ¢ £  ¥   ¦ §  ¨  ©  ª «  ¬   SHY ®    °  ±   ²  ³  ´ µ ¶ · ¸ ¹  º »  ¼   ½   ¾   ¿ Å Æ  Ð Ø Þ  ß  æ  ÷   ø þ
                              // ! c lb yen | SS " (c) a << not SHY (R)  ^0 +/- ^2 ^3 ' u P . , ^1 o >> 1/4 1/2 3/4 ? A AE D O Th ss ae d : o th
                              return iconv('ISO-8859-1', 'ASCII//TRANSLIT//IGNORE', $iso8859_1);
                          }
                          

                          【讨论】:

                            猜你喜欢
                            • 2012-01-21
                            • 2015-08-30
                            • 2010-09-19
                            • 2012-12-10
                            • 2019-01-09
                            • 2012-03-30
                            • 1970-01-01
                            • 2019-03-31
                            相关资源
                            最近更新 更多