/ / Naplniť premenné reťazcami z reťazca - php, string, preg-match

Naplniť premenné reťazcami z reťazca - php, reťazec, predbežná zhoda

Skúsil som rôzne PHP str_* funkcie, ale nemôže nájsť správnu kombináciu nahradiť, explode(), atď. robiť to, čo potrebujem.

Chcem uchopiť nejaký konkrétny text, ktorý bude v reťazci -ex pod:

Zmluvné podmienky: # 928374 (Val: $2.50, Pridať "l poplatok: 10.25%)

Poznamenajte si strunové struny tučným písmom. Musím ich chytiť z toho hlavného reťazca. Tieto tučné hodnoty sa samozrejme niekoľkokrát menia na jedného používateľa, čo ma skutočne vyhodí. Neodvážený text je konzistentný / konštantný.

Vie niekto, či to, čo sa pokúšam - je možné splniť? Ak áno, môžete nám poskytnúť nejaké usmernenie / náhľad? Bolo by veľmi ocenené.

odpovede:

1 pre odpoveď č. 1

Vzhľadom na to, že väčšina hodnôt je statická, môžetenahradiť (väčšinu) statických hodnôt z reťazca a explodovať na medzery. Potom zostanete s troma hodnotami (s čiarkou na hodnotách, ktoré môžete odstrániť).

$replace = array("Terms of Service ID: #", "(Val: $", "Add"l fee: ", "%)");
$string = "Terms of Service ID: #928374 (Val: $2.50, Add"l fee: 10.25%)";

$result = str_replace($replace, "", $string);  // Replace static strings
$pieces = explode(" ", $result);               // Explode on spaces, get pieces
$pieces[1] = rtrim($pieces[1], ",");           // Trim away the trailing comma

$id = $pieces[0];
$value = $pieces[1];
$fee_percent = $pieces[2];

3 pre odpoveď č. 2

Môžete zvážiť použitie regulárneho výrazu pre toto:

$str = "Terms of Service ID: #928374 (Val: $2.50, Add"l fee: 10.25%)";
$pattern = "/Terms of Service ID: (#[0-9]+) (Val: ($[0-9.]+), Add"l fee: ([0-9.]+%))/";
$matches = array();
preg_match($pattern, $str, $matches);

Potom je to len otázka prístupu k zachyteným hodnotám v $matches pole v indexoch 1, 2 a 3.


editovať

Tu je kompaktnejší regulárny výraz, ktorý by mal byť odolnejší voči zmenám formátovania a vylučuje $ a % znakov z výsledkov:

$str = "Terms of Service ID: #928374 (Val: $2.50, Add"l fee: 10.25%)";
$pattern = "/(#[0-9]+)[^$]+$([0-9.]+)[^0-9]+([0-9.]+)%/";
$matches = array();
preg_match($pattern, $str, $matches);

Výstupom tohto špecifického príkladu je:

$matches = array(
"#928374 (Val: $2.50, Add"l fee: 10.25%",  //matched from the entire regular expression
"#928374",  //first capture group
"2.50",     //second capture group
"10.25"     //third capture group
);

-1 pre odpoveď č. 3

Pre tento problém môžete použiť regex.

Ak máte chvíľu, budem hrať niečo pre rôzne veci, ktoré chcete vyzdvihnúť.

$str = "Terms of Service ID: #928374 (Val: $2.50, Add"l fee: 10.25%)";
$id = preg_match("/#[0-9]*/", $str, $matches)[0];
$val = preg_match(/$[0-9]*.[0-9]*/, $str, $matches)[0];