我想用一个空格替换多余的空格(连续空白字符的实例),只要这些额外的空格不是双引号或单引号(或我可能想要包含的任何其他外壳)。
我看到了一些类似的问题,但我找不到对上述需求的直接回应。谢谢!
答案 0 :(得分:2)
你可以分几步完成。请考虑以下示例:
$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 !".
虽然这不是最漂亮的解决方案。
答案 1 :(得分:2)
希望你还在寻找,或者回来检查!这似乎对我有用:
'/\s+((["\']).*?(?=\2)\2)|\s\s+/'
...并替换为 $1
修改强>
此外,如果您需要允许转发引号,例如\"
或\'
,您可以使用此表达式:
'/\s+((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/'
如果您想添加对括号内“平衡”引号的支持(例如()
或{}
)
结束编辑
如果您发现问题或想要解释,请告诉我们!
HOPEFULLY FINAL EDIT AND WARNINGS
/(?:^|\s+)((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/
\s+
替换(?:^|\s+)
.
和\s
速记字符类替换为您要匹配的特定字符来解决此问题,如下所示:/(?:^|[ \t]+)((["\'])(\\\\\2|(?!\2)[\s\S])*?(?=\2)\2)|[ \t]{2,}/
示例强>
上示例文字的第一个表达式和最后一个表达式的示例