2012-06-25 35 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)