2010-09-29 56 views
4

我需要删除字符串中的所有空格,但引号应该保持原样。删除空白字符,除了PHP中的引号?

下面是一个例子:

string to parse: 
hola hola "pepsi cola" yay 

output: 
holahola"pepsi cola"yay 

任何想法?我确信这可以用正则表达式完成,但任何解决方案都可以。

+0

能双引号引号之间的逃脱,或者是一个非(例如,应该“hola hola”百事可乐“yay”变成“holahola”百事可乐“yay”或“hola hola”百事可乐“yay”)? – Wrikken 2010-09-29 21:08:50

回答

5

我们可以匹配字符串或报价与

[^\s"]+|"[^"]*" 

所以我们只需要preg_match_all和串联的结果。


Example

$str = 'hola hola "pepsi cola" yay'; 

preg_match_all('/[^\s"]+|"[^"]*"/', $str, $matches); 

echo implode('', $matches[0]); 
// holahola"pepsi cola"yay 
2

马尔蒂,复活这个问题,因为它有一个简单的解决方案,可以让你一气呵成,无需破灭替换。 (发现你的问题而做一些研究的一般问题有关how to exclude patterns in regex

下面是我们简单的regex:

"[^"]*"(*SKIP)(*F)|\s+ 

交替的左侧匹配完整"quoted strings"然后故意失败。右侧匹配空格字符,并且我们知道它们是正确的空白字符,因为它们没有与左侧表达式匹配。

这段代码演示了如何使用正则表达式(见本online demo底部的结果):

<?php 
$regex = '~"[^"]*"(*SKIP)(*F)|\s+~'; 
$subject = 'hola hola "pepsi cola" yay'; 
$replaced = preg_replace($regex,"",$subject); 
echo $replaced."<br />\n"; 
?> 

参考

How to match (or replace) a pattern except in situations s1, s2, s3...