2015-07-05 116 views
0

我目前正在從我的數據庫中檢索數據。我收到一個包含帶有UTF8編碼值的'標題'索引的數組。我想就是用這個值作爲其中的東西將被保存的文件名,所以我這樣做:PHP - preg_replace和UTF8

file_put_contents($filename, $content); 

其中$ filename是

'-' . $category['root'] . '-articles-' . $category['id'] . '-' . $this->Urlize($category['category']) 

這裏「Urlize」 的代碼:

private function Urlize($value) 
{ 
    if ($value != null && trim($value) != '') 
    { 
     $value = preg_replace('/([\[\(].*[\]\)])/i', '', $value); 
     $value = preg_replace('/[\s]/i', '-', $value); 
     $value = preg_replace('/[,!?.;:\"\'&+\/]/i', '-', $value); 
     $value = preg_replace('/[-]+/i', '-', $value); 
     $value = preg_replace('/(^-)/i', '', $value); 
     $value = preg_replace('/-$/i', '', $value); 
     $value = preg_replace('/[éèê]/i', 'e', $value); 
     $value = preg_replace('/[âà]/i', 'a', $value); 
     $value = preg_replace('/[öô]/i', 'o', $value); 
     $value = preg_replace('/[ûùü]/i', 'u', $value); 
     $value = preg_replace('/[îïíì]/i', 'i', $value); 
     $value = preg_replace('/[#]/i', 'sharp', $value); 
     $value = preg_replace('/[<>]/i', '-', $value); 

     if ($value[strlen($value) - 1] == '-') 
     { 
      $value = substr($value, 0, strlen($value) - 1); 
     } 
    } 

    return strtolower($value); 
} 

我的問題是,標題爲 「Théorie興業銀行」,我得到 「theeorie-geeneerale」,所以 「E」 都翻了一倍。我想這是關於字符集的東西,我無法找到避免它的好方法。當然,我想要有「theorie-generale」。

感謝

回答

4

你需要在正則表達式使用Unicode時使用unicode的改性劑,u

所以嘗試:

function Urlize($value) { 
    if ($value != null && trim($value) != '') 
    { 
     $value = preg_replace('/([\[\(].*[\]\)])/i', '', $value); 
     $value = preg_replace('/[\s]/i', '-', $value); 
     $value = preg_replace('/[,!?.;:\"\'&+\/]/i', '-', $value); 
     $value = preg_replace('/[-]+/i', '-', $value); 
     $value = preg_replace('/(^-)/i', '', $value); 
     $value = preg_replace('/-$/i', '', $value); 
     $value = preg_replace('/[éèê]/iu', 'e', $value); 
     $value = preg_replace('/[âà]/iu', 'a', $value); 
     $value = preg_replace('/[öô]/iu', 'o', $value); 
     $value = preg_replace('/[ûùü]/ui', 'u', $value); 
     $value = preg_replace('/[îïíì]/ui', 'i', $value); 
     $value = preg_replace('/[#]/i', 'sharp', $value); 
     $value = preg_replace('/[<>]/i', '-', $value); 

     if ($value[strlen($value) - 1] == '-') 
     { 
      $value = substr($value, 0, strlen($value) - 1); 
     } 
    } 
    return strtolower($value); 
} 
echo Urlize('Théorie générale'); 

演示:http://sandbox.onlinephpfunctions.com/code/3b7e5985dc23ac71a6298783d2dad646d875d3c8

輸出:

theorie,興業

您可以使用|(或)分組,以減少preg_replace的數量你h AVE。它可能會讓你的正則表達式更難閱讀。你也可以使用數組來查找和替換。這是第一種方法。

function Urlize($value) { 
    if ($value != null && trim($value) != '') 
    { 
     $value = preg_replace('/(([\[\(].*[\]\)])|(^-)|-$)/i', '', $value); 
     $value = preg_replace('/([,!?.;:\"\'&+\/]|[\s]|[-]+|[<>])/i', '-', $value); 
     $value = preg_replace('/[éèê]/iu', 'e', $value); 
     $value = preg_replace('/[âà]/iu', 'a', $value); 
     $value = preg_replace('/[öô]/iu', 'o', $value); 
     $value = preg_replace('/[ûùü]/ui', 'u', $value); 
     $value = preg_replace('/[îïíì]/ui', 'i', $value); 
     $value = preg_replace('/[#]/i', 'sharp', $value); 
     if ($value[strlen($value) - 1] == '-') { 
      $value = substr($value, 0, strlen($value) - 1); 
     } 
    } 
    return strtolower($value); 
} 
echo Urlize('Théorie générale'); 
+0

正是我在找的東西。非常感謝 ! – ssougnez