删除空白字符,除了PHP中的引号内部?

时间:2010-09-29 19:05:56

标签: php regex parsing whitespace quotation-marks

我需要从字符串中删除所有空格,但引用应保持不变。

以下是一个例子:

string to parse:
hola hola "pepsi cola" yay

output:
holahola"pepsi cola"yay

有什么想法吗?我确信这可以用正则表达式完成,但任何解决方案都没问题。

2 个答案:

答案 0 :(得分:6)

我们可以将字符串或引号与

匹配
[^\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

答案 1 :(得分:2)

Martti,恢复了这个问题,因为它有一个简单的解决方案,让你可以一次性替换 - 不需要内爆。 (在针对how to exclude patterns in 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...