2009-08-03 66 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);