如何将特殊字符转换为普通字符?

15

我试图转换像这样的字符:

ë, ä, ï, ö, etc.

转换成普通字符,比如:

e, a, i, o, etc.

什么是最好的方法呢?我尝试了很多方法,比如preg_replace和str_replace。

有人能帮我吗?

-- 编辑 --

我所尝试的是:

$ts = array("[À-Å]","Æ","Ç","[È-Ë]","/[Ì-Ï]/","/Ð/","/Ñ/","/[Ò-ÖØ]/","/×/","/[Ù-Ü]/","/[Ý-ß]/","/[à-å]/","/æ/","/ç/","/[è-ë]/","/[ì-ï]/","/ð/","/ñ/","/[ò-öø]/","/÷/","/[ù-ü]/","/[ý-ÿ]/");

$tn = array("A","AE","C","E","I","D","N","O","X","U","Y","a","ae","c","e","i","d","n","o","x","u","y");

$title = preg_replace($ts, $tn, $text);

1
可能是PHP转换的重复问题。 - Quentin
这里的正确术语应该是重音字符。特殊字符是像$#@/\等东西。 - lgaud
3个回答

40

试试这个...对我有效。

iconv('utf-8', 'ascii//TRANSLIT', $text);

4
UTF8和UTF-8对我都不起作用。字符被替换成问号,仅此而已。 - CREEATION
1
@CREE7EN 先尝试设置地区: setlocale(LC_CTYPE,'en_US.UTF8'); 这样编码看起来会更好。 - Neograph734
我有两个字符串,它们包含相同的单词。在使用iconv解决方案之前,strcmp返回大于0的值。现在,strcmp返回0,这意味着它们是相等的。 - sdx11

33

我喜欢Stewie的答案,但为了完整起见,这个对我也有效。

preg_replace("/&([a-z])[a-z]+;/i", "$1", htmlentities($foo));

我认为这种方法更好,因为它不依赖于服务器的语言环境。我曾经遇到过一些问题,使用iconv('utf-8', 'ascii//TRANSLIT', $text);在本地运行良好,但一旦推送到服务器上,结果就会有所不同,可能是因为服务器的语言环境不同。 - FooBar

0
例如,可以从内容标题创建一个简单易读的URL:
function cleanurl($title) {
        return urlencode(strtolower(str_replace(" ","-",preg_replace("/&([a-z])[a-z]+;/i", "$1", htmlentities($title)))));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接