2011-07-19 282 views
3

我想如何從字符串中刪除長詞。大於長度n的詞。刪除長詞正則表達式

我試過如下:

//remove words which have more than 5 characters from string 
$s = 'abba bbbbbbbbbbbb 1234567 zxcee ytytytytytytytyt zczc xyz'; 
echo preg_replace("~\s(.{5,})\s~isU", " ", $s); 

給人的輸出(這是不正確的):

abba 1234567 ytytytytytytytyt zczc xyz 
+0

@stereofrog - 是的,我應該已經定義了更好,它可以是任何字符 –

回答

1
<?php 
//remove words which have more than 5 characters from string 
$s = 'abba bbbbbbbbbbbb 1234567 zxcee ytytytytytytytyt zczc xyz'; 

$patterns = array(
    'long_words' => '/[^\s]{5,}/', 
    'multiple_spaces' => '/\s{2,}/' 
); 

$replacements = array(
    'long_words' => '', 
    'multiple_spaces' => ' ' 
); 
echo trim(preg_replace($patterns, $replacements, $s)); 
?> 

輸出:

abba zczc xyz 

更新,以解決您的意見提出的問題。你可以這樣說:

<?php 
//remove words which have more than 5 characters from string 
$s = '123&nbsp;ReallyLongStringComesHere&nbsp;123'; 

$patterns = array(
    'html_space' => '/&nbsp;/', 
    'long_words' => '/[^\s]{5,}/', 
    'multiple_spaces' => '/\s{2,}/' 
); 

$replacements = array(
    'html_space' => ' ', 
    'long_words' => '', 
    'multiple_spaces' => ' ' 
); 
echo str_replace(' ', '&nbsp;', trim(preg_replace($patterns, $replacements, $s))); 
?> 

輸出:

123&nbsp;123 
+0

不錯,只有一個照顧網址也是 –

+0

@Imran Omar Bukhsh:謝謝!如果我的答案解決了您的問題,請考慮通過點擊答案左側的投票計數下方的勾號來接受它。 – Shef

+0

是的,我不介意這樣做,但如果你可以通過還告訴我如何刪除單詞開頭和結尾的單詞,請使用  –

5

使用這個表達式:\b\w{5,}\b。它會匹配很長的單詞。

  1. \b - 單詞邊界
  2. \w{5,} - 字母數字5或多次重複
  3. \b - 單詞邊界
+0

字符串它不會刪除一個長的URL –

+0

@Imran,什麼是「長的URL」?任何示例... –

+0

示例'testing 123 htttp://stackoverflow.com/questions/6744272/removing-long-words-regex/6744316#6744316測試123'; - 它不會刪除url –

1

一個更好的辦法也許使用的,而不是一個正則表達式規則的字符串操作?一個簡單的implode /爆炸和strlen將很好地做。取決於你的字符串的大小,但對你的例子來說應該沒問題。

0

你接近:

preg_replace("~\w{5,}~", "", $s); 

工作分區鍵盤例如:http://codepad.org/c5AN1E6M

而且,你要多個空格摺疊成一個:

preg_replace("~ +~", " ", $s); 

Example for this one

+0

它不會刪除一個長url –

0

添加全局修飾符g或我們e preg_match_all()

0

摘要:

  • 任何回答起點或\s結束將無法在開始刪除單詞和結束字符串(你應該使用一個測試字符串失敗,這些!)
  • \b不會這樣失敗,但它w不要刪除空格。你可以將這個建議的雙空間去除器結合起來,但不能保留原來的重複空格(這可能不是問題)。
  • explode + implode具有很好的屬性,它保留了重複的空格,但是您必須爲每個空格字符執行此操作。
  • 保留空白的替代方案(我在這裏沒有看到)是使用兩種模式,一種以開始,以\s結尾,另一種以\s開始並以$結束。
+0

任何人都可以在這裏找到bug嗎? ;) –

+0

沒有錯誤,只是一個不完整的解決方案,檢查答案標記爲正確的 –

+0

有一個錯誤,我可以向你保證。關於另一個答案:好吧,你沒有在問題中指定,你在我的答案後詢問了這個問題。順便說一句,如果你不想保留空白的解決方案是好的。 –