2012-09-29 73 views
0

我想轉換用戶輸入字符串的preg_replace用戶輸入字符串轉換爲鏈接模式

「的東西......聯合國//重要,,,像,這個」

「的東西,非重要樣這個」

所以基本上與刪除所有重複的特殊字符「 - 」。我GOOGLE了,來到這個

preg_replace('/[-]+/', '-', preg_replace('/[^a-zA-Z0-9_-]/s', '-', strtolower($string))); 

我很好奇,知道這是否可以用單一的preg_replace()來完成。

只是爲了澄清事情了: 取代所有特殊字符和連字符空格( - )。如果發生以上連續出現單連字符替換它們

我的解決方案完美的作品,我想,但我希望做同樣的在一個單一的通話

回答

3

有昨天是類似的問題,但我手邊沒有。

在當前的第一模式:

[^a-zA-Z0-9_-] 

你要找的只是一個字符。如果你做的是一個或多個貪婪匹配,正則表達式引擎會自動用一個單一的一個替代這些多:

[^a-zA-Z0-9_-]+ 
       ^- + = one or more 

然後,您仍然有存在的-裏面的字符串沒有被卡住的問題,所以你需要帶他們出去了「未在」字符類:

[^a-zA-Z0-9_]+ 

這則應該這樣做:

preg_replace('/[^a-zA-Z0-9_]+/s', '-', strtolower($string)); 

而且因爲它是唯一小寫的,你不需要找A-Z爲好,只是另一種減少:

preg_replace('/[^a-z0-9_]+/s', '-', strtolower($string)); 

見以及重複和/或量詞其中+是(見Repetition­Docs之一; Repetition with Star and Plus­regular-expressions.info)。

此外,如果你在modifiers­Docs看一看,你會發現S(PCRE_DOTALL)改性劑是沒有必要的:

$urlSlug = preg_replace('/[^a-z0-9_]+/', '-', strtolower($string)); 

希望這有助於,並解釋了一些關於正則表達式你正在使用,還有你可以找到進一步文檔,這是有幫助的。

+0

謝謝你的詳細解答。正則表達式有時會超過我的頭。 – Rohan210

+0

它是一個強大的工具,現在在[preg模塊(PCRE)](http://php.net/pcre)中的php手冊中也有文檔。正則表達式的一個很好的閱讀是http://regular-expressions.info/,它很好地分開,在我眼中是一個非常好的資源。 – hakre

+0

謝謝你們以後的鏈接絕對會經過這些鏈接。 – Rohan210

0

試試這個:

preg_replace('/[^a-zA-Z0-9_-]+/s', '-', strtolower($string)); 
相關問題