2009-08-03 99 views
0

我有一组数据可能混合字符,特殊字符和“口音”字符等翻译字母VS特殊字符

我一直在使用PHP inconv与TRANSLIT,但今天发现子弹点被转换为“公牛”。我不知道这样的其他字符不会被转换或删除。 $,*,%等被删除。

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

这是我一直在使用

 

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

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

的代码,如果我移动的preg_replace为高于inconv功能,他们在翻译前的重音字符将被删除,所以那并不是”不管工作。

对此的任何想法?或TRANSLIT中错过了哪些非字母字符?

---------------------编辑------------------------ --------- 奇怪的是,它似乎并不是将子弹变成“公牛”的TRANSLIT。我评论了替代品,而“公牛”已经回到了重点。不幸的是,我试图用它来创建可读的URL以及其他一些东西,所以我仍然需要进行URL编码。

+0

是否ASCII //忽略走得太远? – rojoca 2009-08-04 01:44:04

+0

我认为它确实太过分了,但是我再看看它。 – pedalpete 2009-08-04 01:50:28

+0

如果你有一个给你麻烦的字符列表,那么http://php.net/strtr可能会有所帮助。有些评论可能是有用的 – rojoca 2009-08-04 02:27:22

回答

0

你可以尝试使用POSIX正则表达式:

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

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

0

最后,这竟然是一个错误的字符集的组合,以及窗户如何处理inconv。

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

其次,当在windows中使用iconv时,你不能明显地组合ASCII // TRANSLIT // IGNORE,谢天谢地你可以在windows中做。

现在在Linux上,所有重音字符都被转换为它们的基本字符,并且非alpha数字被删除。

这里是新的代码

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