Php 正则表达式替换引号外的空格(任意)

Php 正则表达式替换引号外的空格(任意),php,regex,Php,Regex,假设我有这个字符串: this is a "test for stackoverflow", with 'single quotes too' and "combined 'quotes single and double'" 我需要得到: thisisa"test for stackoverflow",with'single quotes too'and"combined 'quotes single and double'" 这只是一个例子,但是引号可以嵌套到3个级别(“str'str“

假设我有这个字符串:

this is a "test for stackoverflow", with 'single quotes too' and "combined 'quotes single and double'"
我需要得到:

thisisa"test for stackoverflow",with'single quotes too'and"combined 'quotes single and double'"

这只是一个例子,但是引号可以嵌套到3个级别(“str'str“str””),也可能有多行。我需要一个正则表达式来替换引号外的所有空格。

可能不是最优雅的解决方案,但这是一个开始(不支持不表示引号的单撇号。请在前面替换这些空格,稍后再替换):


您可以将此正则表达式用于:

$s = <<< EOF
this is a "test for stackoverflow" , with 'single quotes too' and "combined 'quotes single and double'"
EOF;
echo preg_replace('/(?| *(".*?") *| *(\'.*?\') *)| +/s', '$1', $s);
$s=Simple(*SKIP)(*F)魔术!
使用以下正则表达式:

/(?:"[^"]++"|'[^']++')(*SKIP)(*F)|\s/

表达式说明:

  • (?:“[^”]+”|“[^”]+”)
    匹配引号和引号内的所有内容
  • (*SKIP)(*F)
    跳过指向下一个位置的指针并放弃匹配
  • |
    或(仅当上述备选方案尚未放弃时,才会匹配以下内容
  • \s
    空白

不要使用正则表达式。试图将正则表达式应用于此问题时,您会发疯的。@nOneNo我能用什么?我需要几行代码和性能。遍历字符串,跟踪嵌套级别,并输出到一个新字符串,在该字符串中跳过空格。除非您试图解析10MB以上的字符串,否则性能应该是良好的(在这种情况下,您会遇到不同的问题)。除非您的输入文本带有预先替换的撇号,否则您只需使用双引号。@NNONNEO不是真的!S-F可以应用于这个简单的正则表达式问题。对于多行?它对我很有效。@anubhava您能解释一下第一次匹配时空的
的含义吗?谢谢。如果您是asking关于
(?|…)
然后它被称为:非捕获组,注意:在该构造的每个备选方案中声明的子模式将从相同的索引重新开始。我如何添加到此表达式以删除新行?@Xriuk你是什么意思?
[^”]
[^']
匹配新行,
\s
也匹配新行。
/(?:"[^"]++"|'[^']++')(*SKIP)(*F)|\s/