2010-07-07 156 views
0

我目前使用這一段代碼通過去除,以減少給定文本到一個有效的「標籤」格式(僅小寫,AZ和減去允許)/替換無效字符優化「標記」的正則表達式

 $zip_filename = strtolower($original); 
     $zip_filename = preg_replace("/[^a-zA-Z\-]/g", '-', $zip_filename); //replace invalid chars 
     $zip_filename = preg_replace("/-+/g", '-', $zip_filename); // reduce consecutive minus to only one 
     $zip_filename = preg_replace("/^-/g", '', $zip_filename); // removing leading minus 
     $zip_filename = preg_replace("/-$/g", '', $zip_filename); // remove trailing minus 

不限提示如何把至少正則表達式放入一個單一的?

感謝您的任何建議!

+0

爲什麼不會$ zip_filename = preg_replace(「/ [^ a-zA-Z \ - ]/g」,'',$ zip_filename); //用無效 工作替換無效字符? – murgatroid99 2010-07-07 20:57:26

回答

3
$zip_filename = trim(preg_replace("/[^a-z]+/", '-', $zip_filename),'-'); 

說明:

  1. A-Z是無用的,因爲它應該是小寫
  2. 右支架後添加+將替換一個或多個連續的無效字符
  3. 使用trim與第二個參數 - 字符以修剪形式開始和結束將加快代碼
  4. 刪除\-preg_replace也將採取連字符之間的連字符之間的連字符汽車,將其替換爲單個連字符。
+0

這並不考慮多個連續的連字符,我不這麼認爲。 – 2010-07-07 21:16:58

+0

@鉑金 - 你說得對。它也不會處理連續的空格,或者前導或尾部破折號。 – 2010-07-07 21:20:07

+0

白金是正確的。 0ßDie - S§$「%idsfg SDG $ 將導致 模 - S-idsfg-SDG (一個連字符太多) – Nogga 2010-07-07 21:20:41

0

這應該簡化它大大...

$zip_filename = trim(strtolower($original)); 
$zip_filename = preg_replace("/\s\s+|--+|[^a-zA-Z-]/g", '-', $zip_filename); 

trim會照顧的空間之前和後弦。還請注意\s\s+--+。這些更有效地發現重複。如果連續有2個或更多,他們將只有匹配那些字符,因此避免不必要的替換操作。

但從技術上說,它仍然有可能有前導或尾隨破折號。爲此,你還是會需要這個......

$zip_filename = preg_replace("/^-|-$/g", '', $zip_filename); 

(最後這一步操作不能真正地與其他因爲您使用的是不同的替換字符串相結合。)

0

你通過將這四個操作合併爲一個,只會使代碼更難理解/維護。

您也不需要基於正則表達式的操作的複雜性和性能,以實現您所需的操作。

的雙單減號的減少可以與環狀呼叫可以更容易地實現到str_replace函數:

while (substr_count($zip_filename, '--')) { 
    $zip_filename = str_replace('--', '-', $zip_filename); 
} 

包裝這個向上以良好命名的類的方法將抽象掉任何明顯的複雜性和幫助代碼的可讀性。

最後兩個操作可以通過trim()函數處理:

$zip_filename = trim($zip_filename, '-'); 

然後,您可以用的東西較少的CPU積極的,可以說是比較容易更換您的基於正則表達式的操作讓別人明白:

//replace invalid chars 
$zip_filename = preg_replace("/[^a-zA-Z\-]/g", '-', strtolower($original)); 

// reduce consecutive minus to only one 
while (substr_count($zip_filename, '--')) { 
    $zip_filename = str_replace('--', '-', $zip_filename); 
} 

// remove leading and trailing minus 
$zip_filename = trim($zip_filename, '-');