2011-03-10 103 views
3

我正在寫一個小的CMS,我試圖把一個標題變成一個帶短劃線的URL段落。我知道我需要做幾件事,而且我已經掌握了所有的東西,但我不喜歡它。問題似乎是,如果最後有特殊字符,我需要在進入數據庫之前將其刪除。我唯一能想出來的方法是在一個聲明中做2個preg_replace。所以它看起來是這樣的:必須有一個更好的正則表達式

preg_replace("/\-$/","",preg_replace('/[^a-z0-9]+/i', "-", strtolower($title))); 

,它並把這種:(this is a title!!!)))**that is (strange))

這個:this-is-a-title-that-is-strange

但這種表達只是看起來像驢。必須有更好的編碼方式,或者其他的東西,我只是不知道。任何幫助將不勝感激

+1

請注意,對於以無效字符開頭的標題,您可能還需要刪除'/^- + /'。另外,如果你的第一個正則表達式是'/ - + $ /'來刪除多個破折號? – 2011-03-10 04:30:25

+1

可能有一種方法可以將命令縮減爲單個函數調用,但您現在擁有的方式是可讀可讀的,單功能版本不太可能是這些東西。 – 2011-03-10 04:31:34

+0

@Brad:他仍然需要將字符串中的字母小寫,即使進行了修改。 – 2011-03-10 04:31:58

回答

4

您可以只需一個電話到preg-replace與陣列輸入爲:

preg_replace(array('/[^a-z0-9]+/','/^-|-$/'), // from array 
       array('-',''),     // to array 
       strtolower($title));    

請注意,您的現有代碼保持領先-如果有的話。上面的代碼擺脫了這一點。

+0

這是否按順序替換正則表達式? from數組中的第二個替換取決於第一個已經完成的替換。 – 2011-03-10 04:37:32

+0

@Jeremiah Willcock:是的。替換依次發生。第二個是在第一個之後應用的。 – codaddict 2011-03-10 04:38:57

0

一個選項,它仍然需要兩個替代,但需要同時兼顧的開始和結束短線的一個傳球,就是:

preg_replace('/[^a-z0-9]/', '', 
    preg_replace('/([a-z0-9])[^a-z0-9]+([a-z0-9])/', '$1-$2', 
    strtolower($title))); 

還有的選擇:

implode('-', 
    preg_split('/[^a-z0-9]/', 
      strtolower($title), 
      PREG_SPLIT_NO_EMPTY)); 
0

使用trim

trim(preg_replace('/[^a-z0-9]+/i', "-", strtolower($title)), '-')