preg_split 正则表达式 - 需要围绕数学运算符拆分用户输入

preg_split regex - need to split user input around mathematical operators

我需要将给定的用户字符串拆分为基于数学运算符的数组。我需要字符串拆分的符号是:

+
-
/
*
()

不过,我想扩展正则表达式以包括我将添加到我的程序中的其他运算符。 到目前为止我的正则表达式是这样的:

"((\(|\d+.+|-|\*|\/\d+\|))"

当 运行 到 regex101.com 匹配给定的输入字符串时: (30*30)/(9+8) 和 '30*30)/(9+8)

我希望输出与此类似:

[0] = 
[1] = (
[2] = 30
[3] = *
[4] = 30
[5] = )

or: 
 [0] = 
 [1] = 4
 [2] = *
 [3] = 4

取决于括号中是否存在于用户字符串中。

我忘记包含当前正则表达式字符串的当前结果: 使用 http://www.phpliveregex.com/ 测试 preg-split,输入字符串为:

(30*30)+(9*8)
the result:
array(3
0 =>    
1 =>    
2 =>    
)

这是您正在寻找的模式吗?

preg_match_all("/(\(|-\d+|\d+|-|\+|\/|\*|\))/", $input, $output);

https://regex101.com/r/acKW27/3

Preg_match_all: http://www.phpliveregex.com/p/l7L

我忘记了 / 在正则表达式中。链接也更新了。

preg_split() 通过使用 PREG_SPLIT_DELIM_CAPTURE 标志保留分隔符。包括附加标志 PREG_SPLIT_NO_EMPTY 以消除任何空元素。这是一个改进的答案,可以处理您的样本输入数据,以及浮点数和负数。

代码:(Demo)

$expression = '-1*(2/(3+4)--10*-110.5/0.009+-.1)';

var_export(
    preg_split(
        '~(-?\d*(?:\.\d+)?|[()*/+-])~',
        $expression,
        0,
        PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE
    )
);

输出:

array (
  0 => '-1',
  1 => '*',
  2 => '(',
  3 => '2',
  4 => '/',
  5 => '(',
  6 => '3',
  7 => '+',
  8 => '4',
  9 => ')',
  10 => '-',
  11 => '-10',
  12 => '*',
  13 => '-110.5',
  14 => '/',
  15 => '0.009',
  16 => '+',
  17 => '-.1',
  18 => ')',
)

*注意,我上面的模式使小数点前的数字成为可选的。如果你知道你的浮点数总是在点之前有一个数字,那么你可以使用这个模式:

~(-?\d+(?:\.\d+)?|[()*/+-])~

优点是:没有空匹配,不需要PREG_SPLIT_NO_EMPTY,提高了模式效率。