如何删除重音并将字母转换为"普通"ASCII字符?

Mar*_*lor 44 php regex string ascii

什么是从字符串如取出口音的最有效的方式ÈâuÑ变成Eaun

是否有一种简单的,内置的方式,我缺少或正则表达式?

Pis*_*3.0 52

如果您安装了iconv,请尝试此操作(该示例假设您的输入字符串为UTF-8):

echo iconv('UTF-8', 'ASCII//TRANSLIT', $string);
Run Code Online (Sandbox Code Playgroud)

(iconv是一个可以在各种编码之间进行转换的库;它是高效的,并且默认包含在许多PHP发行版中.最重要的是,它比尝试推出自己的解决方案更容易,更容易出错(你知道吗? "拉丁字母N卷曲"?我也不.))

  • +1打败我吧.这应该是最好的.但是,请注意,如果输入中存在无效字符(使用`ASCII // TRANSLIT // IGNORE`应该有帮助),这往往会失败,并且如果经常遇到问题,用户贡献的Notes是一个很好的读取.http://www.php.net/manual/en/function.iconv.php (9认同)
  • 出于某种原因,有时候我无法让它发挥作用.请参阅http://codepad.viper-7.com/SUufA4但是在另一台机器上,我得到了"E ^ au~N".但不是很理想. (5认同)
  • 起初这对我不起作用.口音字符刚刚变成?字符.根据PHP手册页上对iconv()的评论,我首先运行:setlocale(LC_ALL,'en_CA.utf8'); 然后一切都很完美.'en_CA.utf8'是我系统上的默认语言环境.尝试"locale -a"查看可用语言环境列表 (4认同)
  • 这为我解决了问号.`setlocale(LC_ALL,"en_US.utf8"); $ string = iconv('UTF-8','ASCII // TRANSLIT // IGNORE',$ string);` (4认同)

Sim*_*ity 48

我找到了一个解决方案,在我的所有测试用例中都有效(从http://php.net/manual/en/transliterator.transliterate.php复制):

var_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; [\u0080-\u7fff] remove',
    "A æ Übérmensch på høyeste nivå! ? ? ????? PHP! ????. ? ¦"));
// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi "
Run Code Online (Sandbox Code Playgroud)

见:http://www.php.net/normalizer

编辑:此解决方案独立于使用setlocale()设置的语言环境.与iconv()相比的另一个好处是,即使是非拉丁字符也不会被忽略.

编辑2:我发现,有一些字符,我最初发布的音译没有涵盖.Any-Latin将西里尔字符?转换为不适合拉丁字符集的字符:?(http://en.wikipedia.org/wiki/Prime_%28symbol%29).我添加[\u0100-\u7fff] remove了删除所有这些非拉丁字符.我还在文本中添加了一个测试;)

我建议,他们的意思是拉丁字母,而不是拉丁字符集之一Latin.但无论如何 - 在我看来,他们应该把它音译成ASCII然后Latin-ASCII......

编辑3:对不起,这里有另一个变化.我不得不将字符缩小到u0080而不是u0100,只能输入ASCII字符作为输出.上面的测试已更新.

  • 注意:它需要启用`php_intl.dll`扩展名 (3认同)
  • 需要注意的是,这不仅仅是音译文本(如OP要求的那样),但也会删除一些字符.例如€(欧元符号)将被删除.只需通过'Any-Latin; 拉丁-ASCII;" 作为保留这些的第一个参数.或者,您可以使用iconv('UTF-8','ASCII // TRANSLIT // IGNORE',$ str)将"€"转换为"EUR". (3认同)

neo*_*kio 20

根据@palantir的要求重新发布此信息...

我发现iconv完全不可靠,我不喜欢preg_replace解决方案和大数组......所以我最喜欢的方式(也是我发现的唯一可靠的方法)是......

function toASCII( $str )
{
    return strtr(utf8_decode($str), 
        utf8_decode(
        'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
        'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是可靠的方法.不适用于像ŻŹĆŃĄŚŁĘÓżźćńąśłęó`这样的波兰口音.试试`var_dump(strtr(utf8_decode('qqqqŻŹĆŃĄŚŁĘÓżźćńąśłęóqqq'),utf8_decode('ŻŹĆŃĄŚŁĘÓżźćñąśłęó'),'ZZCNASLEOzzcnasleo'));`我有`string(25)"qqqqeeeeeeeeOeeeeeeeeoqqq"`.Iconv更可靠`var_dump(iconv('UTF-8','ASCII // TRANSLIT // IGNORE','qqqqŻŹĆŃĄŚŁĘÓżźćńąśłęóqqq'));`我得到`string(25)"qqqqZZCNASLEOzzcnasleoqqq"` (14认同)
  • 将'Горловка'转换为YYYYYYYY,不好 (2认同)

Gum*_*mbo 13

您可以使用iconv将字符音译为纯US-ASCII,然后使用正则表达式删除非字母字符:

preg_replace('/[^a-z]/i', '', iconv("UTF-8", "US-ASCII//TRANSLIT", $text))
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用Normalizer标准化为规范化表格KD(NFKD),然后删除标记字符:

preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD))
Run Code Online (Sandbox Code Playgroud)

  • @Pekka:使用`iconv`的`ÈâuÑ`的音译给出了`\`E ^ au~N`.这就是使用以下清理的原因. (2认同)

小智 12

注意:我是从另一个类似的问题转发这个,希望它对其他人有帮助.

我最终写了一个基于Django项目的URLify.js的PHP库,因为我发现iconv()太不完整了.你可以在这里找到它:

https://github.com/jbroadway/urlify

处理拉丁字符以及希腊语,土耳其语,俄语,乌克兰语,捷克语,波兰语和拉脱维亚语.