假设我有以下字符串:
1 + 2 * (3 + (23 + 53 - (132 / 5) + 5) - 1) + 2 / 'test + string' - 52
我想将其拆分为运算符和非运算符的数组,但不得拆分()
和之间的任何内容'
。
我希望输出为:
[1, "+", 2, "*", "(3 + (23 + 53 - (132 / 5) + 5) - 1)", "+", 2, "/", "'test + string'", "-", 52]
我正在使用此代码:
preg_split("~['\(][^'()]*['\)](*SKIP)(*F)|([+\-*/^])+~", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
该技术可以满足操作员和操作员的要求'
,但不能满足要求()
。但是,它仅保留(132 / 5)
(最深的嵌套括号表达式)并拆分所有其他表达式,从而得到以下输出:
[1, "+", 2, "*", "(3", "+", "(23", "+", 53, "-", "(132 / 5)", "+", "5)", "-", "1)", "+", 2, "/", "'test + string'", "-", 52]
如何确保最外面的括号表达式及其所有内容在一起?
您可以使用一种模式来递归匹配平衡括号的第一个子模式,然后使用“跳过失败”。轮换之后,您仍然可以使用捕获组,该组将是组2,并且由于该PREG_SPLIT_DELIM_CAPTURE
标志而将保留这些值。
要删除空条目,可以添加PREG_SPLIT_NO_EMPTY
标志。
(?:(\((?:[^()]++|(?1))*\))|'[^']*')(*SKIP)(*F)|([+\-*/^])
$str = "1 + 2 * (3 + (23 + 53 - (132 / 5) + 5) - 1) + 2 / 'test + string' - 52";
$result = preg_split("~(?:(\((?:[^()]++|(?1))*\))|'[^']*')(*SKIP)(*F)|([+\-*/^])~", $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($result);
输出
Array
(
[0] => 1
[1] => +
[2] => 2
[3] => *
[4] => (3 + (23 + 53 - (132 / 5) + 5) - 1)
[5] => +
[6] => 2
[7] => /
[8] => 'test + string'
[9] => -
[10] => 52
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句