0

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

我一直在使用带有 translit 的 php inconv,但今天注意到一个项目符号点被转换为“公牛”。我不知道像这样的其他字符不会被转换或删除。$、*、% 等确实会被删除。

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

这是我一直在使用的代码

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

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

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

对此有什么想法吗?或者 TRANSLIT 中遗漏了哪些非字母字符?

---------------------已编辑---------------------------- ----- 奇怪的是,似乎不是 TRANSLIT 将子弹更改为“公牛”。我注释掉了 preg-replace,“公牛”已经回到了一个要点。不幸的是,我正在尝试使用它来创建可读的 url 以及其他一些东西,所以我仍然需要进行 url 编码。

4

3 回答 3

0

尝试将 /u 修饰符添加到 preg_replace。请参阅模式修改器

于 2009-08-03T23:35:35.963 回答
0

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

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

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

于 2009-08-03T23:39:42.850 回答
0

最后,这被证明是错误字符集的组合,以及 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);  
于 2009-08-04T16:56:23.947 回答