我有一堆数据可能是混合字符,特殊字符和“重音”字符等。
我一直在使用带有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编码。
答案 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);