我想用一个空格替换额外的空格(连续空白字符的实例),只要这些额外的空格不在双引号或单引号中(或我可能想要包含的任何其他附件)。
我看到了一些类似的问题,但我在上面找不到对我的需求的直接回应。谢谢!
您可以分几个步骤完成。考虑以下示例:
$str = 'This is a string with "Bunch of extra spaces". Leave them "untouched !".';
$id = 0;
$buffer = array();
$str = preg_replace_callback('|".*?"|', function($m) use (&$id, &$buffer) {
$buffer[] = $m[0];
return '__' . $id++;
}, $str);
$str = preg_replace('|\s+|', ' ', $str);
$str = preg_replace_callback('|__(\d+)|', function($m) use ($buffer) {
return $buffer[$m[1]];
}, $str);
echo $str;
这将输出字符串:
This is a string with "Bunch of extra spaces". Leave them "untouched !".
虽然这不是最漂亮的解决方案。
希望你还在寻找,或者回来检查!这似乎对我有用:
'/\s+((["\']).*?(?=\2)\2)|\s\s+/'
...并替换为 $1
编辑
此外,如果您需要允许转义引号,例如\"
or \'
,您可以使用以下表达式:
'/\s+((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/'
如果您想添加对括号等“平衡”引号的支持(例如()
或{}
) ,它会变得有点粘
结束编辑
如果您发现问题或想要一些解释,请告诉我!
希望最后的编辑和警告
/(?:^|\s+)((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/
\s+
为(?:^|\s+)
.
和速记字符类来解决,如下所示:\s
/(?:^|[ \t]+)((["\'])(\\\\\2|(?!\2)[\s\S])*?(?=\2)\2)|[ \t]{2,}/
例子
此链接显示了在http://codepad.viper-7.com上的示例文本中使用的第一个表达式和最后一个表达式的示例