PHP-如何用正则替换不包含在单引号和双引号之中的连续空白符?

PHP-如何用正则替换不包含在单引号和双引号之中的连续空白符?

晚风撩人 发布于 2017-07-07 字数 155 浏览 1188 回复 3

我想把一段文本中的连续多个空白符替换成一个,但是包含在单引号和双引号之中的空白符不能被替换。单引号和双引号需要配对匹配。
请问正则应该如何写呢?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

偏爱自由 2017-10-16 3 楼

<?php
// "" => "[^\""]*(\.[^\"]*)*"
$text1 = " April fools 'a b'c d' day is "a b\"c d" 04/01/2002 ";
$text2 = " April fools 'a d' day is "a d" 04/01/2002 ";

function reduce_space($matches)
{
// as usual: $matches[0] is the complete match
// $matches[1] the match for the first subpattern
// enclosed in '(...)' and so on
return $matches[1].' '.$matches[3];
}

$pattern = '|([^ '"]*)( +)(('[^\\']*(\\.[^\\']*)*')*("[^\\"]*(\\.[^\\"]*)*")*)|';
echo preg_replace_callback($pattern, "reduce_space", $text1);
echo "done1n";
echo preg_replace_callback($pattern, "reduce_space", $text2);
echo "done2n";

查看源码吧,显示时可能多个空格显示为一个空格了。

清晨说ぺ晚安 2017-09-20 2 楼

原意:CCA B28
对应:A(s*)B
替换:AsB

(s*)是作为\1 所以你也可以 在\1上动手脚

泛泛之交 2017-07-18 1 楼

获取有"或者'且包含空格的<(["'])[^"']*[s][^"']*($1)>
获取全部包含空格的<[^"']*[s][^"']*>
对比下 排除即可