2011-03-24 86 views
2
$string = 'Hello this is a bunch of numbers: 333 and letters and $pecial [email protected]!*('; 

$foo = preg_replace("/[^a-zA-Z0-9\s]/", "", $string); 

echo $foo; 

以上的回报:如何使用PHP正则表达式压缩空格字符?

Hello this is a bunch of numbers 333 and letters and pecial Characters 

我想保留空格但如果那里有一个以上。如何做到这一点?

它应该看起来像:

Hello this is a bunch of numbers 333 and letters and pecial Characters 
+0

'pecial' 字?当然看起来'''没有保留。 – Cyclone 2011-03-24 01:13:42

+0

@Cyclone对,它应该只保留字母,数字和单个空格。 – 2011-03-24 01:15:01

回答

5
$foo = preg_replace("/[^a-zA-Z0-9\s]/", "", $string); 
$foo = preg_replace('/\s+/',' ',$foo); 
+0

嗯,这返回:Hellothisisabunchofnumbers333andlettersandpecialCharacters都混乱起来。我想保留空间,只是不超过一个。 – 2011-03-24 01:10:52

+0

是的,我发现后大约2s了。请参阅编辑。必须将其分解为2个正则表达式,因为您正在替换w/2个不同的东西。 – 2011-03-24 01:11:16

+1

在第一次替换中,您仍然需要在字符类中使用'\ s',以避免删除所有空格。 – 2011-03-24 01:14:34

1

我没有用PHP的工作,但在Perl它是这样的:

s/\s+/ /g 

如更换一个或多个空格的任何序列只有一个空间。

所以我想象中的PHP压缩空间将是:

$foo = preg_replace("/\s{2,}/", " ", $string); 

我不认为应该与运行两个了preg_replace行,尤其是如果它使代码更清晰的任何问题。

+0

不,它和你的perl正则表达式一样:用一个空格替换一个或多个\ s。 fyi preg_xxx函数使用pcre正则表达式(与perl相同) – 2011-03-24 01:21:02

+0

我在谈论编辑前的版本 - 但是我编辑了我的帖子以删除最后一个段落,因为它不再是真的。 :) – George 2011-03-24 02:58:27

2

一个正则表达式将做到这一点:

$foo = preg_replace('/[^a-zA-Z0-9\s]|(\s)\s+/', '$1', $string); 
+0

啊,这是非常光滑的,我没想到利用捕获的组 – 2011-03-24 01:19:10

+0

在PHP中,如果捕获组1是未定义的或空值,是空字符串替换?或者是上一场比赛保留1美元? – sln 2011-03-24 01:31:52

+0

捕获的组给出一个空字符串,如果没有捕获到任何东西 – 2011-03-24 01:46:11

0

代替全局(编辑 - 测试):

/(?<=\s)\s+|[^a-zA-Z0-9\s]+/

与 “”

相关问题