可悲的是,这是另一个正则表达式问题,因为它只是出于某种原因而逃避了我的心理能力。
我在数组上运行foreach循环,如下所示
array(7) {
[0]=>
string(9) "(1+1)+1=2*2"
[1]=>
string(6) "2+3<=4"
[2]=>
string(8) "(2+3)>=4"
[3]=>
string(6) "2+3<>4"
[4]=>
string(5) "2+3<4"
[5]=>
string(5) "2+3>4"
[6]=>
string(9) "(2+3)+3=8"
}
我试图通过比较运算符将其拆分但保留运算符。为了举例说明我在获取密钥[0]
并生成输出数组之后所做的事情。
array(){
[0]=>
string() "(1+1)+1"
[1]=>
string() "="
[2]=>
string() "2*2"
}
这是我到目前为止所得到的,但它没有得到运营商
preg_match_all( "~(^[()|\d|+|-|*|/]+(=)([()|\d|+|-|*|/]))~", $expression, $expression_parts );
提前致谢
答案 0 :(得分:3)
通过调用preg_split()
并仅隔离比较运算符,您可以节省大量的卷积。
代码:(Demo)
$strings=[
"(1+1)+1=2*2",
"2+3<=4",
"(2+3)>=4",
"2+3<>4",
"2+3<4",
"2+3>4",
"(2+3)+3=8"
];
foreach($strings as $string){
var_export(preg_split('~([<>=]+)~',$string,NULL,PREG_SPLIT_DELIM_CAPTURE));
echo "\n";
}
输出:
array (
0 => '(1+1)+1',
1 => '=',
2 => '2*2',
)
array (
0 => '2+3',
1 => '<=',
2 => '4',
)
array (
0 => '(2+3)',
1 => '>=',
2 => '4',
)
array (
0 => '2+3',
1 => '<>',
2 => '4',
)
array (
0 => '2+3',
1 => '<',
2 => '4',
)
array (
0 => '2+3',
1 => '>',
2 => '4',
)
array (
0 => '(2+3)+3',
1 => '=',
2 => '8',
)
说明:
preg_split()
是explode()
的多功能正则表达式版本。该模式告诉函数应该发生爆炸的每个实例。
~ #Pattern delimiter
( #Start capture group
[<>=]+ #Match (as much as possible) one or more comparison symbols
) #End capture group
~ #Pattern delimiter
单独的模式不能按要求工作 - 必须在此函数调用中声明标志。
参数3为NULL
:这表示preg_split()
无限次匹配。这是函数的默认行为,但是要使参数4起作用,我们需要使用此占位符。
参数4是PREG_SPLIT_DELIM_CAPTURE
:这告诉函数保留用作“爆炸点”的子串。如果没有此标志,则输出数组将不包含比较符号。如果我们不打算使用此标志,那么捕获组括号在模式中将是不必要的。
以下是preg_split()
兄弟如何使用正面和否定角色类进行操作:
foreach($strings as $string){
var_export(preg_match('~([^<>=]+)([<>=]+)([^<>=]+)~',$string,$out)?array_slice($out,1):[]);
echo "\n";
var_export(preg_match_all('~[^<>=]+|[<>=]+~',$string,$out)?$out[0]:[]);
echo "\n\n";
}