Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 翻译字母与特殊字符_Php_Character Encoding_Character - Fatal编程技术网

Php 翻译字母与特殊字符

Php 翻译字母与特殊字符,php,character-encoding,character,Php,Character Encoding,Character,我有一堆数据,可以是混合字符、特殊字符和“重音”字符等等 我一直在将php inconv与Translatit一起使用,但今天注意到一个要点被转换为“bull”。我不知道还有什么像这样的角色不会被转换或删除。 $、*、%等确实会被删除 基本上我想做的是保留字母,但只删除“非语言”部分 这是我一直在使用的代码 $slugIt = @iconv('UTF-8', 'ASCII//TRANSLIT', $slugIt); $slugIt = preg_replace("/[^a-zA-Z

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

我一直在将php inconv与Translatit一起使用,但今天注意到一个要点被转换为“bull”。我不知道还有什么像这样的角色不会被转换或删除。 $、*、%等确实会被删除

基本上我想做的是保留字母,但只删除“非语言”部分

这是我一直在使用的代码

$slugIt = @iconv('UTF-8', 'ASCII//TRANSLIT', $slugIt); $slugIt = preg_replace("/[^a-zA-Z0-9 -]/", "", $slugIt); $slugIt=@iconv('UTF-8','ASCII//translatit',$slugIt); $slugIt=preg_替换(“/[^a-zA-Z0-9-]/”,“,$slugIt”); 当然,如果我将preg_replace移到inconv函数的上方,则重音字符将在翻译之前被删除,因此这也不起作用

有什么想法吗?或者翻译中遗漏了哪些非字母字符

---------------------编辑---------------------------------
奇怪的是,它似乎不是把子弹改成“公牛”的音译。我注释掉了preg替换,“bull”已经回到了一个要点。不幸的是,我正试图用它来创建可读的url,以及其他一些东西,所以我仍然需要进行url编码

尝试将/u修改器添加到preg\u replace。
请参见

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

$slugIt = ereg_replace('[^[:alnum:] -]', '', $slugIt);
$slugIt = @iconv('UTF-8', 'ASCII//TRANSLIT', $slugIt);
[:alnum:]将匹配任何字母数字字符(包括带有重音的字符)。

查看PHP的POSIX实现的更多信息。

最后,这被证明是中错误字符集的组合,以及windows如何处理inconv

首先,我有一个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); $slugIt=@iconv('iso-8859-1','ASCII//TRANSLIT//IGNORE',$slugIt); $slugIt=preg_替换(“/[^a-zA-Z0-9]/”,“,$slugIt);
POSIX正则表达式和ereg_*函数被折旧,不建议使用。感谢zildjohn,我从来都不知道这一点,甚至没有想过要查看。我尝试过/u,但我不确定是否正确使用了它。这就是我现在拥有的$slugIt=@iconv('UTF-8','ASCII//TRANSLIT',$slugIt)$slugIt=preg_替换(“/[^a-zA-Z0-9-]/u”,”,$slugIt);我还是有点不对劲。我也尝试过将pre_replace置于iconv之上,但没有乐趣。ASCII//IGNORE是否走得太远了?我认为它走得太远了,但我正在重新审视它。如果您有一个给您带来麻烦的字符列表,那么可能会有所帮助。有些评论可能有用是的,问题是我不确定这些角色会是什么。我发现子弹现在是一个相当随机的问题,但我怎么才能知道还有什么可能不会被抓住呢?回答中可能有很多不同的特殊角色,我必须一个接一个地分析它们,找出它们是什么,然后去掉它们。我运行的脚本的全部目的就是为了不必这样做。