簡體   English   中英

如何在PHP中使用regex或preg_match將字符串的精確部分提取為變量?

[英]How to use regex or preg_match in PHP to extract exact parts of a string as a variables?

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)}"

$dataItem->calculation來自數據庫。

我正在嘗試將值(2350,3000,1090,2860,4000)提取為單獨的變量(這些值可以更改,因此我想匹配任何東西)

之間

if(([item-237_isChecked])){(

")}" ).

做了大量測試,但沒有成功:

$calculationString1 = preg_match('/if(([item-237_isChecked])){((.*?))}/', addslashes($dataItem->calculation));

更新:我通過使用explode()簡化了輸入來解決了這個問題:

    $somestring1 = explode(PHP_EOL, addslashes($dataItem->calculation));

    $somesubstring1 = explode('{',$somestring1[0]);
    $somesubstring2 = explode('{',$somestring1[1]);
    $somesubstring3 = explode('{',$somestring1[2]);
    $somesubstring4 = explode('{',$somestring1[3]);
    $somesubstring5 = explode('{',$somestring1[4]);


    preg_match('/[0-9]{1,6}+/', $somesubstring3[1], $singlelongprice1);
    preg_match('/[0-9]{1,6}+/', $somesubstring4[1], $singlewidelongprice1);
    preg_match('/[0-9]{1,6}+/', $somesubstring1[1], $doublelongprice1);
    preg_match('/[0-9]{1,6}+/', $somesubstring2[1], $triplelongprice1);
    preg_match('/[0-9]{1,6}+/', $somesubstring5[1], $quodlongprice1);

    $singlelongprice = implode($singlelongprice1);
    $singlewidelongprice = implode($singlewidelongprice1);
    $doublelongprice = implode($doublelongprice1);
    $triplelongprice = implode($triplelongprice1);
    $quodlongprice = implode($quodlongprice1);

看起來,隔離目標數字字符串不需要匹配右側)}因此我從我的模式中省略了該部分。 我正在匹配{( ,然后用\\K重新開始全字符串匹配,然后匹配連續的數字。

在檢查preg_match_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;

輸出:

$singlelongprice1 = 2350
$singlewidelongprice1 = 3000
$doublelongprice1 = 1090
$triplelongprice1 = 2860
$quadlongprice1 = 4000

PS我改變quodquad 每當你需要制定一個正則表達式模式,運行測試@ https://regex101.com這樣的: https://regex101.com/r/31pNLa/1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM