Pis*_*3.0 52
如果您安装了iconv,请尝试此操作(该示例假设您的输入字符串为UTF-8):
echo iconv('UTF-8', 'ASCII//TRANSLIT', $string);
Run Code Online (Sandbox Code Playgroud)
(iconv是一个可以在各种编码之间进行转换的库;它是高效的,并且默认包含在许多PHP发行版中.最重要的是,它比尝试推出自己的解决方案更容易,更容易出错(你知道吗? "拉丁字母N卷曲"?我也不.))
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字符作为输出.上面的测试已更新.
neo*_*kio 20
根据@palantir的要求重新发布此信息...
我发现iconv完全不可靠,我不喜欢preg_replace解决方案和大数组......所以我最喜欢的方式(也是我发现的唯一可靠的方法)是......
function toASCII( $str )
{
return strtr(utf8_decode($str),
utf8_decode(
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
Run Code Online (Sandbox Code Playgroud)
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)
小智 12
注意:我是从另一个类似的问题转发这个,希望它对其他人有帮助.
我最终写了一个基于Django项目的URLify.js的PHP库,因为我发现iconv()太不完整了.你可以在这里找到它:
https://github.com/jbroadway/urlify
处理拉丁字符以及希腊语,土耳其语,俄语,乌克兰语,捷克语,波兰语和拉脱维亚语.
| 归档时间: |
|
| 查看次数: |
61121 次 |
| 最近记录: |