我需要删除字符串中的所有空格,但引号应该保持原样。删除空白字符,除了PHP中的引号?
下面是一个例子:
string to parse:
hola hola "pepsi cola" yay
output:
holahola"pepsi cola"yay
任何想法?我确信这可以用正则表达式完成,但任何解决方案都可以。
我需要删除字符串中的所有空格,但引号应该保持原样。删除空白字符,除了PHP中的引号?
下面是一个例子:
string to parse:
hola hola "pepsi cola" yay
output:
holahola"pepsi cola"yay
任何想法?我确信这可以用正则表达式完成,但任何解决方案都可以。
我们可以匹配字符串或报价与
[^\s"]+|"[^"]*"
所以我们只需要preg_match_all
和串联的结果。
$str = 'hola hola "pepsi cola" yay';
preg_match_all('/[^\s"]+|"[^"]*"/', $str, $matches);
echo implode('', $matches[0]);
// holahola"pepsi cola"yay
马尔蒂,复活这个问题,因为它有一个简单的解决方案,可以让你一气呵成,无需破灭替换。 (发现你的问题而做一些研究的一般问题有关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...
能双引号引号之间的逃脱,或者是一个非(例如,应该“hola hola”百事可乐“yay”变成“holahola”百事可乐“yay”或“hola hola”百事可乐“yay”)? – Wrikken 2010-09-29 21:08:50