Php 如何去除重音并将字母转换为;普通的;ASCII字符?

Php 如何去除重音并将字母转换为;普通的;ASCII字符?,php,regex,string,ascii,Php,Regex,String,Ascii,从字符串中去除重音最有效的方法是什么,例如,uñ变成Eaun 是否有我缺少的简单内置方式或正则表达式?如果已安装iconv,请尝试以下操作(该示例假定输入字符串为UTF-8): (iconv是一个可以在各种编码之间进行转换的库;它非常高效,默认情况下包含在许多PHP发行版中。最重要的是,它肯定比尝试使用自己的解决方案更容易、更能防止错误(您知道有一个“带卷曲的拉丁字母N”?)您可以使用iconv将字符音译为纯US-ASCII,然后使用正则表达式删除非字母字符: preg_replace('/[^

从字符串中去除重音最有效的方法是什么,例如,
变成
Eaun


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

如果已安装iconv,请尝试以下操作(该示例假定输入字符串为UTF-8):


(iconv是一个可以在各种编码之间进行转换的库;它非常高效,默认情况下包含在许多PHP发行版中。最重要的是,它肯定比尝试使用自己的解决方案更容易、更能防止错误(您知道有一个“带卷曲的拉丁字母N”?)

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

preg_replace('/[^a-z]/i', '', iconv("UTF-8", "US-ASCII//TRANSLIT", $text))
preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD))
另一种方法是使用规范化为,然后删除标记字符:

preg_replace('/[^a-z]/i', '', iconv("UTF-8", "US-ASCII//TRANSLIT", $text))
preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD))

应@palantir的请求重新发布此信息

我发现iconv完全不可靠,我不喜欢preg_替换解决方案和大型阵列。。。所以我最喜欢的方法(也是我找到的唯一可靠的方法)是


注意:我从另一个类似的问题转载了这个问题,希望对其他人有所帮助

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


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

我找到了一个解决方案,它适用于我所有的测试用例(复制自):

见:

编辑:此解决方案独立于使用setlocale()设置的区域设置。iconv()的另一个优点是,即使是非拉丁字符也不会被忽略

EDIT2:我发现,有些字符没有被我最初发布的音译所覆盖
任何拉丁语
都会将西里尔文字符转换为不适合拉丁语字符集的字符:
ʹ
()。我添加了
[\u0100-\u7fff]remove
来删除所有这些非拉丁字符。我还在文本中添加了一个测试;)

我建议,它们指的是拉丁字母表,而不是这里的拉丁字符集。但无论如何,在我看来,他们应该把它翻译成ASCII,然后用
拉丁ASCII



EDIT3:很抱歉这里又有变化。我必须将字符降到u0080,而不是u0100,以仅获取ASCII字符作为输出。上面的测试已经更新。

+1比我快。这应该最有效。但是,请注意,如果输入中存在无效字符(使用
ASCII//TRANSLIT//IGNORE
应该会有帮助),并且如果遇到问题,用户提供的注释通常都是很好的读物,则此操作往往会失败。出于某种原因,有时我无法让它工作。但在另一台机器上,我得到了“E^au~N”。但这不是我想要的。这件铬镍铁合金有一些冲突,所以我会问一个类似的问题。起初这对我不起作用。重音字符刚刚变成了什么?人物。根据PHP手册页面上关于iconv()的评论,我首先运行了:setlocale(LC_ALL,'en_CA.utf8');然后一切都很顺利。“en_CA.utf8”是我系统上的默认区域设置。尝试“locale-a”查看可用locale的列表这为我修复了问号<代码>设置语言环境(LC_ALL,“en_US.utf8”)$string=iconv('UTF-8','ASCII//TRANSLIT//IGNORE',$string)@Peeps:告诉用户搜索谷歌违反了堆栈溢出的礼节。如果这个问题在网站上不存在,那么即使OP已经知道答案,如果被问到,对每个人都是好的,因为这会增加我们不重复的问题的数量。所以,也许下次如果有人用谷歌搜索它,他们会发现这个问题,我们还会有一个用户。@Andreas说得好。然而,这肯定是一个重复,所以Peeps有一个小问题:)不过我现在懒得搜索它。
ISO-8859-1
?你确定吗?这难道不会留下至少一票(和他们的8859-1对手一样)?否决票的原因是什么?否决票不是我的。然而,OP并没有要求删除非字母字符,是吗?是我的。现在已恢复,您已将其修复。@Pekka:使用
iconv
的音译给出
`E^au~N
。这就是使用以下清理的原因。您还应该输入以下字母:
ő
Ő
ű
Ű
。谢谢。:)这不是可靠的方法。不为波兰口音的角色工作,比如
。尝试使用var"dump(strtr(utf8"qq"),utf8"qq",utf8"qq","utf8"qq","utf8"qq"naslez我得到了
字符串(25)“qqqqeeeeeeoqq”
。Iconv更可靠
var_dump(Iconv('UTF-8','ASCII//TRANSLIT//IGNORE','qqqqŹĆŚŁžžžžžžžžžęQQ')我得到
字符串(25)“qqqqzzcnasleozcnasleozcnasleoqq”
将我的“ГБСаа”转换为yyyyyyyyyy,这不是性能最好的,它也会产生不正确的结果。像Œ、Æ等字母应该分解成两个字母,而不是一个。这个类处理了我所有的测试用例,其中所有基于iconv的解决方案都失败了。谢谢谢谢你的课。2017年,该项目仍然存在,并且该类在php7中运行良好注:它需要
php_intl.dll
extension enable我同意,这对我来说也是最好的函数!(并且我尝试了很多)非常好的解决方案,非常容易使用,而且最有用的是其他使用str_replace的解决方案。应该注意的是,这不仅会音译文本(如OP所要求的),而且会删除一些chracter。例如€(欧元符号)将被删除。只要通过任何拉丁语;拉丁ASCII码;
var_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; [\u0080-\u7fff] remove',
    "A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi ¦"));
// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi "