如何在PHP中使用regex或preg_match提取字符串的精确部分作为变量?
如何在PHP中使用regex或preg_match提取字符串的精确部分作为变量?,php,Php,$dataItem->calculation来自数据库 我试图将值(23503000109028604000)提取为单独的变量(这些值可以更改,因此我希望匹配任何内容,例如 中间 if([item-237_已检查]){( 及 “”} ). 进行了一系列测试,但没有成功: echo(addslashes($dataItem->calculation)); Returns: "if(([item-237_isChecked])){(2350)} if(([item-238_isChecked
$dataItem->calculation
来自数据库
我试图将值(23503000109028604000)
提取为单独的变量(这些值可以更改,因此我希望匹配任何内容,例如
中间
if([item-237_已检查]){(
及
“”}
).
进行了一系列测试,但没有成功:
echo(addslashes($dataItem->calculation));
Returns:
"if(([item-237_isChecked])){(2350)}
if(([item-238_isChecked])){(3000)}
if(([item-236_isChecked])&&([item-242_isChecked])){(1090)}
if(([item-236_isChecked])&&([item-243_isChecked])){(2860)}
if(([item-239_isChecked])){(4000)}"
更新:
我通过使用explode()
简化输入,解决了这个问题:
隔离目标数字字符串似乎不需要匹配右侧
)}
,因此我在模式中省略了该部分。我正在匹配{(
),然后用\K
重新启动完整字符串匹配,然后匹配连续数字
在检查preg\u match\u all()
是否精确地进行了5次匹配后,我分配了5次完整字符串匹配([0]
是完整字符串匹配子数组),并使用现代数组解构技术将它们分配给变量——这可以用不太现代的list()
调用代替
代码:()
输出:
$data = 'if(([item-237_isChecked])){(2350)}
if(([item-238_isChecked])){(3000)}
if(([item-236_isChecked])&&([item-242_isChecked])){(1090)}
if(([item-236_isChecked])&&([item-243_isChecked])){(2860)}
if(([item-239_isChecked])){(4000)};';
[$singlelongprice1, $singlewidelongprice1, $doublelongprice1, $triplelongprice1, $quadlongprice1] = preg_match_all('~{\(\K\d+~', $data, $matches) == 5 ? $matches[0] : ['','','','',''];
echo '$singlelongprice1 = ' , $singlelongprice1 , "\n";
echo '$singlewidelongprice1 = ' , $singlewidelongprice1 , "\n";
echo '$doublelongprice1 = ' , $doublelongprice1 , "\n";
echo '$triplelongprice1 = ' , $triplelongprice1 , "\n";
echo '$quadlongprice1 = ' , $quadlongprice1;
p、 我将
quod
改为quad
。每当你需要开发正则表达式模式时,就这样运行你的测试:看起来隔离目标数字字符串不需要匹配右侧)}
,所以我从我的模式中省略了这一部分。我正在匹配{(
),然后用\K
重新启动完整字符串匹配,然后匹配连续数字
在检查preg\u match\u all()
是否精确地进行了5次匹配后,我分配了5次完整字符串匹配([0]
是完整字符串匹配子数组),并使用现代数组解构技术将它们分配给变量——这可以用不太现代的list()
调用代替
代码:()
输出:
$data = 'if(([item-237_isChecked])){(2350)}
if(([item-238_isChecked])){(3000)}
if(([item-236_isChecked])&&([item-242_isChecked])){(1090)}
if(([item-236_isChecked])&&([item-243_isChecked])){(2860)}
if(([item-239_isChecked])){(4000)};';
[$singlelongprice1, $singlewidelongprice1, $doublelongprice1, $triplelongprice1, $quadlongprice1] = preg_match_all('~{\(\K\d+~', $data, $matches) == 5 ? $matches[0] : ['','','','',''];
echo '$singlelongprice1 = ' , $singlelongprice1 , "\n";
echo '$singlewidelongprice1 = ' , $singlewidelongprice1 , "\n";
echo '$doublelongprice1 = ' , $doublelongprice1 , "\n";
echo '$triplelongprice1 = ' , $triplelongprice1 , "\n";
echo '$quadlongprice1 = ' , $quadlongprice1;
p、 我将
quod
改为quad
。每当你需要开发一个正则表达式模式时,就这样运行你的测试:谢谢这些帮助,但我仍然无法制作一个很好的正则表达式来满足我的需要,所以我简化了问题,如更新中所示。请你将你的解决方案作为一个单独的答案发布,然后再让它实现他“批准”了这个问题的答案?谢谢!谢谢这些帮助,但我仍然无法制作一个很好的正则表达式来满足我的需要,所以我简化了问题,如更新中所示。请您将您的解决方案作为单独的答案发布,然后将其作为这个问题的“批准”答案?谢谢!
$data = 'if(([item-237_isChecked])){(2350)}
if(([item-238_isChecked])){(3000)}
if(([item-236_isChecked])&&([item-242_isChecked])){(1090)}
if(([item-236_isChecked])&&([item-243_isChecked])){(2860)}
if(([item-239_isChecked])){(4000)};';
[$singlelongprice1, $singlewidelongprice1, $doublelongprice1, $triplelongprice1, $quadlongprice1] = preg_match_all('~{\(\K\d+~', $data, $matches) == 5 ? $matches[0] : ['','','','',''];
echo '$singlelongprice1 = ' , $singlelongprice1 , "\n";
echo '$singlewidelongprice1 = ' , $singlewidelongprice1 , "\n";
echo '$doublelongprice1 = ' , $doublelongprice1 , "\n";
echo '$triplelongprice1 = ' , $triplelongprice1 , "\n";
echo '$quadlongprice1 = ' , $quadlongprice1;
$singlelongprice1 = 2350
$singlewidelongprice1 = 3000
$doublelongprice1 = 1090
$triplelongprice1 = 2860
$quadlongprice1 = 4000