正则表达式用于格式化表达式中的运算符


regex to format operators in a expression

我需要将所有运算符(算术、比较、逻辑...)都放在一个字符串中......

((value+10)*10)>=300   ||   (array[key]-20==0&&"foo==bar"!=="")

。并在它们之前和之后添加一个空格(如果尚不存在)...

((value + 10) * 10) >= 300 || (array[key] - 20 == 0 && "foo==bar" !== "")

。忽略引号或单引号之间的内容。

附加规则:

  • 仅在预入/递减运算符之前添加空格
  • 仅在后入/递减运算符后添加空格

听起来很容易,但我无法理解如何在 PHP 中使用正则表达式来做到这一点。如果有人可以提供帮助,谢谢!

我正在尝试为每个操作员做类似$str = preg_replace('(?<=['w']')'s'"''])'!=(?=['w']')'s'"''])', ' != ', $str);的事情,但我认为这不是一个好主意。

这种模式适用于PCRE引擎,我相信php是

"[^"'r'n]*"(*SKIP)(*F)|'s*(['-'/+*=|<>!&]+)'s*

演示

我会使用三个正则表达式:

<?php
$str = <<<EOT
(-20+3)
((value+10)*10)>=300   ||   (array[key]-20==0&&"foo==bar"!=="")
EOT;
$str = preg_replace('/("[^"]*"|'([^+=&<>|*'/''%'w'd-]*|-?'d+|['w[']]+|'))/', ' $1 ', $str);
$str = preg_replace('/(?<='() +| +(?='))/', '', $str);
$str = preg_replace('/ +/', ' ', $str);
print_r($str);

在这里现场查看。