2010-11-17 125 views
1

我想創建一個slu so,所以我想去掉每一個奇怪的charachter。 slu should只能包含小寫字母和下劃線。有沒有辦法檢查奇怪的charachters並將其過濾出字符串?一切,是不是charachter或下劃線應刪除去掉字符串中所有奇怪的字符串

這是我有:

if(!preg_match_all('/[a-z]/')): 
    $output = preg_replace("/ ... euhm ... /", "", $slug2); 
else: 
    $output = $slug2; 
endif; 

我應該從這樣的:(!再加上免費的PSD)創建一個3D帶狀卷繞的影響

這樣的:create_a_3d_ribbon_wrap_around_effect_plus_a_free_psd

+0

有時候更容易「刪除所有字符,但這個,這個和這個」;我認爲這符合你的情況。 – BeemerGuy 2010-11-17 23:02:25

+2

所以你還想要將空格轉換爲下劃線?數字也可以嗎?你的例子和你的描述不匹配。 – cdhowie 2010-11-17 23:02:41

+0

而你想要'strtolower()'。 – AndreKR 2010-11-17 23:03:32

回答

3
$slug = strtolower($slug); 
$slug = str_replace(" ", "_", $slug); 
$slug = preg_replace("/[^a-z0-9_]/", "", $slug); 
+0

恐怕除了那些古色古香的1960年代* a-z *之外,你已經忘記了一千八百八十二個小寫字母。 ''unichars -a'\ p {Lower}''[^ a-z]'| wc -l' == 1882' – tchrist 2010-11-17 23:43:23

+0

根據OP的例子,這看起來像它將被用於URL中的slu gs。 Unicode字符在URL中看起來很醜,所以我懷疑OP是否想保留它們。 – cdhowie 2010-11-17 23:45:24

+0

同意。但有趣的是,拉丁文,西里爾文和希臘文不止這些。 ;) – AndreKR 2010-11-17 23:55:59

0
$slug = preg_replace("[^a-z_]", "", $slug); 
+0

你忘了近兩千個小寫字母。 – tchrist 2010-11-17 23:44:43

1

不需要進行初始匹配。你可以做一個無條件的搜索和替換。如果沒有東西可以替代,沒有什麼大不了的。這是作爲一個功能的大型連鎖調用:

$slug = trim(preg_replace('/[\W_]+/', '_', strtolower($slug)), '_'); 

或分割成單獨行:

$slug = strlower($slug); 
$slug = preg_replace('/[\W_]+/', '_', $slug); 
$slug = trim($slug, '_'); 

說明:

  1. 轉換大寫與小寫strtolower
  2. 搜索\W_。 「單詞」字符是字母,數字或下劃線。 「非單詞」字符與此相反,即空格,標點符號和控制字符。 \W匹配「非單詞」字符。
  3. 用下劃線替換那些不好的字符。如果連續有多個,他們將被一個下劃線替換。
  4. 從字符串的開始和結尾修剪下劃線。

代碼的在複雜一邊,因爲還有需要處理一些棘手的案件:

  • 在兩端壞字符需要被刪除,不會轉換爲下劃線。例如,您示例中的!)
  • 我們希望foo_-_bar變成foo_bar而不是foo___bar。基本上,下劃線應該被摺疊。