翻译字母和特殊字符

时间:2009-08-03 23:21:22

标签: php character-encoding character

我有一堆数据可能是混合字符,特殊字符和“重音”字符等。

我一直在使用带有translit的php inconv,但今天注意到一个子弹点被转换为'bull'。我不知道这样的其他字符不会被转换或删除。 $,*,%等确实被删除了。

基本上我要做的就是保留字母,但只删除'非语言'位。

这是我一直在使用的代码


        $slugIt = @iconv('UTF-8', 'ASCII//TRANSLIT', $slugIt);  

    $slugIt = preg_replace("/[^a-zA-Z0-9 -]/", "", $slugIt); 

当然,如果我将preg_replace移动到inconv函数之上,重音字符将在它们被翻译之前被删除,因此这也不起作用。

有关于此的任何想法吗?或者在TRANSLIT中错过了哪些非字母字符?

---------------------被修改------------------------- -------- 奇怪的是,似乎并没有将子弹改为'公牛'的TRANSLIT。我评论了preg-replace,并且'bull'已经回到了一个子弹点。不幸的是,我正在尝试使用它来创建可读的URL,以及其他一些东西,所以我仍然需要做url编码。

3 个答案:

答案 0 :(得分:0)

尝试将/ u修饰符添加到preg_replace。 见Pattern Modifers

答案 1 :(得分:0)

您可以尝试使用POSIX Regex:

$slugIt = ereg_replace('[^[:alnum:] -]', '', $slugIt);
$slugIt = @iconv('UTF-8', 'ASCII//TRANSLIT', $slugIt);

[:alnum:]将匹配任何字母数字字符(包括带重音的字符) 有关PHP的POSIX实现的更多信息,请查看http://php.net/manual/en/book.regex.php

答案 2 :(得分:0)

最后,这结果是错误字符集的组合,以及Windows如何处理无效。

首先,我有一个iso-8859字符集,即使我在文档的头部定义了utf-8,php仍然将字符集视为ISO。

其次,在windows中使用iconv时,你显然无法组合ASCII // TRANSLIT // IGNORE,谢天谢地,你可以在windows中做到。

现在在linux上,所有重音字符都被翻译成它们的基本字符,并且删除了非字母数字。

这是新代码

  $slugIt = @iconv('iso-8859-1', 'ASCII//TRANSLIT//IGNORE', $slugIt);  
    $slugIt = preg_replace("/[^a-zA-Z0-9]/", "", $slugIt);  
相关问题