2010-08-23 112 views
2

我試圖從我的字符串中刪除一個以上的白色大字:正則表達式:刪除白字

$content = preg_replace('/\s+/', " ", $content); //in some cases it doesn't work 

,但是當我寫

$content = preg_replace('/\s\s+/', " ", $content); //works fine 

有人能解釋一下爲什麼?

,因爲當我寫/\s+/爲什麼它不工作,它必須匹配所有與一個或多個空白字符,?

感謝

+1

給我們一個片段,重現此問題。要不然。 – polygenelubricants 2010-08-23 19:33:46

+0

對不起,問題出在另一個地方。 我在將數據插入數據庫時​​失去了價值。非常非常奇怪的行爲,我會找到原因並更新問題。 – Simon 2010-08-23 20:02:16

回答

5

什麼是你想匹配的空白字符的最小數目?

\s+相當於\s\s* - 一個強制性的空白字符,後跟任意數量的更多字符。

\s\s+相當於\s\s\s* - 2個強制性空白字符後跟任意數量更多(如果這是你想要的東西,它可能是更清晰的\s{2,})。

另外請注意,$content = preg_replace('/\s+/', " ", $content);將用一個空格代替任何單個空格$content。換句話說,如果你的字符串只有包含單個空格,結果將不會改變。

+0

最小數字是2,但我沒有看到使用'/ \ s + /'結構的任何潛在風險,但是在某些情況下它刪除了一部分字符串。我在myslq數據庫中使用這個結構,並且在某些領域我遇到了這樣的問題。 – Simon 2010-08-23 19:38:59

+0

如上所述,'/ \ s + /'不符合2空間要求。 – 2010-08-23 19:39:45

+0

好的,但是如何刪除其他詞,我無法理解。 – Simon 2010-08-23 19:44:27

0

我只是想補充到,之所以你/ S + /工作有時而不是別人,就是正則表達式是非常貪婪的,所以它會嘗試匹配一個或多個空格字符,以及多達它可以匹配。我認爲這是你找到解決方案絆倒的地方。

對不起,我還沒有能夠添加註釋,或者我剛纔說丹尼爾的回答此評論,這是很好的。

+1

我認爲這會產生相反的效果。一個貪婪的正則表達式可以匹配儘可能多的空間,並用一個空格來替換它們,從而完成OP所需的操作。 _ungreedy_ regexp會導致問題行爲。對? – LarsH 2010-08-23 19:46:37

0

你使用Ungreedy選項(/ U)嗎?它沒有在你的代碼中這麼說,但是如果是這樣的話,它可以解釋爲什麼第一個preg_replace()用一個空格替換每個單獨的空間(沒有改變)。在這種情況下,第二個preg_replace()將用一個空格替換每個雙空間。如果你嘗試第四個空格的字符串,結果是雙空間,我會懷疑不合理。

0

嘗試preg_replace("/([\s]{2,})/", " ", $text)

+0

沒有必要在一個字符類中粘貼'\ s',或者將整個表達式粘在一個組中。 '/ \ s {2,} /'相當於,更短更清晰。 – 2010-08-23 19:46:42

+0

我認爲,當一切都在其組或其他類型的分離時,它們看起來更清晰。但是,是的,它們是相同的。 – Quamis 2010-08-24 11:03:07