Regex(PHP)删除除引号(";和';&x27;)之间的所有水平空白(包括转义引号)

Regex(PHP)删除除引号(";和';&x27;)之间的所有水平空白(包括转义引号),php,regex,preg-replace,removing-whitespace,Php,Regex,Preg Replace,Removing Whitespace,使用preg_replace(PHP),我想删除除引号(“”和“”)之间的空格(包括转义引号)之外的所有水平空格 例如(正则表达式应在右侧向左旋转): 使用我得出的结论: \h(?=[^']*(?:“[^']*”[^']*)*$)(?=[^”]*(?:“[^”]*“[^”]*)*$) 它基本上是向前看,并检查在字符串结束之前是否有偶数的引号(包括“”和“”) 但是,我对引号中的转义字符和引号有问题 " ' test " => The ' causes problem " \" test

使用preg_replace(PHP),我想删除除引号(“”和“”)之间的空格(包括转义引号)之外的所有水平空格

例如(正则表达式应在右侧向左旋转):

使用我得出的结论:
\h(?=[^']*(?:“[^']*”[^']*)*$)(?=[^”]*(?:“[^”]*“[^”]*)*$)

它基本上是向前看,并检查在字符串结束之前是否有偶数的引号(包括“”和“”)

但是,我对引号中的转义字符和引号有问题

" ' test "  => The ' causes problem
" \" test " => The \" causes problem
我曾考虑过使用负面的lookbehinds:
(?您可以使用

'~(?<!\\\\)(?:\\\\{2})*(?:"[^\\\\"]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\')(*SKIP)(*F)|\h+~s'
输出:

Array
(
    [0] => 2+2
    [1] => f(" ")
    [2] => f("Test \"mystring\" .")
    [3] => f("' "," ")
)
'~(?<!\\\\)(?:\\\\{2})*(?:"[^\\\\"]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\')(*SKIP)(*F)|\h+~s'
$strs = ['2 + 2', 'f( " ")', 'f("Test \\"mystring\\" .")', 'f("\' ",   " ")'];
$rx = '~(?<!\\\\)(?:\\\\{2})*(?:"[^\\\\"]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\')(*SKIP)(*F)|\h+~s';
print_r( preg_replace($rx, '', $strs) );
Array
(
    [0] => 2+2
    [1] => f(" ")
    [2] => f("Test \"mystring\" .")
    [3] => f("' "," ")
)