我需要将所有运算符(算术、比较、逻辑...)都放在一个字符串中......
((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);
在这里现场查看。