2012-06-25 90 views
1

考慮下面的輸入刪除單個字符的話 -如何從字符串的preg_replace

"I went to 1 ' and didn't see p" 

, 什麼是PHP的preg_replace函數功能來刪除所有單個字符(和遺留空格)的正則表達式,以使輸出將是 -

"went to and didn't see".

我一直在尋找一個解決方案,這一點,但不能找到一個。類似的例子沒有包含正則表達式的解釋,所以我一直無法使它們適應我的問題。所以,請,如果你知道如何做到這一點,請提供正則表達式,但也要分解它,以便我能理解它的工作原理。

乾杯

回答

2

試試這個:

$output = trim(preg_replace("/(^|\s+)(\S(\s+|$))+/", " ", $input)); 
  • (^|\s+)意思是 「字符串或空間(S)的開始」
  • (\s+|$)意味着「結束字符串空間(s)「
  • \S是單一的非空格字符
+0

這會在字符串末尾留下空格,不是嗎? – edam

+0

這就是爲什麼那裏有trim()'呼叫 – poncha

+1

@poncha這不會在那裏留下第一個單引號嗎?像「去」並沒有看到「 – buckley

0

試試這個正則表達式

'\s+\S\s+' -> ' ' 
+0

儘管如此:'單詞1,單詞' - 如果您需要支持'\ b',請嘗試播放 – Guard

0

你需要兩遍

首先是要去掉所有單個字符

(?<=^|).(?=$|) replace with empty string 

第二個是,只留下一個空格

[ ]{2,} replace with single space 

你將會得到一個字符串h作爲開始或結束時可能的空間。我只想修剪這與你的語言,而不是這樣做,用正則表達式

作爲一個例子,第一個正則表達式是用PHP編寫的像

$result = preg_replace('/(?<=^|).(?=$|)/sm', '', $subject); 
0

嘗試的implodeexplodearray_filter

幫助
$str ="I went to 1 ' and didn't see p"; 
$arr = explode(' ',$str); 
function singleWord($var) 
{ 
    if(1 !== strlen($var)) 
    return $var; 
} 
$final = array_filter($arr,'singleWord'); 

echo implode(' ',$final); 
//return "went to and didn't see"(length=19)