⊗ppPmRgRCb 260 of 447 menu

Înlocuire cu callback prin expresii regulate în PHP

Să presupunem că avem următorul șir:

<?php $str = '2+3= 3+5= 7+8='; ?>

Să presupunem că trebuie să găsim toate construcțiile de forma număr+număr= și să facem astfel încât după semnul egal să apară rezultatul adunării.

Pentru rezolvarea unei astfel de probleme este convenabil să folosim funcția preg_replace_callback, care funcționează similar cu funcția preg_replace - găsește și înlocuiește după o expresie regulată, dar permite efectuarea de manipulări suplimentare cu fragmentele găsite.

Primul parametru al funcției primește expresia regulată, al doilea - cu ce să înlocuim, al treilea - șirul în care se efectuează înlocuirea.

În acest caz, celui de-al doilea parametru trebuie să i se transmită o funcție-callback, care va fi apelată pentru fiecare potrivire găsită.

Primul parametru al callback-ului trebuie să fie o variabilă în care va intra rezultatul găsit. Această variabilă va fi un array al grupurilor (capturilor) găsite.

Să încercăm în practică. Să scriem cod care să prindă subșirurile noastre, punând primul număr în primul grup, iar al doilea - în al doilea:

<?php $str = '2+3= 3+5= 7+8='; preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { var_dump($match); }, $str); ?>

Ca rezultat, var_dump-ul nostru va funcționa de trei ori, afișând pe rând următoarele:

['2+3=', '2', '3'] ['3+5=', '3', '5'] ['7+8=', '7', '7']

Mergem mai departe. Fiecare potrivire va fi înlocuită cu ceea ce returnează callback-ul prin return. Să înlocuim, de exemplu, fiecare dintre subșirurile căutate cu semnul '!':

<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return '!'; }, $str); echo $res; // va afișa '! ! !' ?>

Și acum să înlocuim fiecare subșir cu suma perechii de numere din el:

<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return $match[1] + $match[2]; }, $str); echo $res; // va afișa '5 8 13' ?>

Rezultă că sarcina noastră este aproape rezolvată. Mai rămâne să facem astfel încât înaintea sumei să rămână subșirul căutat. Pentru aceasta vom insera înaintea sumei conținutul grupului zero:

<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return $match[0] . ($match[1] + $match[2]); }, $str); echo $res; // va afișa '2+3=5 3+5=8 7+8=13' ?>

Este dat șirul:

<?php $str = 'The numbers are 3, 7 and 12'; ?>

Înlocuiți toate numerele din șir cu pătratele lor.

Rezultatul așteptat:

'The numbers are 9, 49 and 144'

Este dat șirul:

<?php $str = '2023-01-15 2022-12-31 2024-05-20'; ?>

Transformați toate datele în formatul zi.lună.an.

Este dat șirul:

<?php $str = 'Costs: $15, $20, $100'; ?>

Măriți toate prețurile cu 10%.

Română
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Folosim cookie pentru funcționarea site-ului, analiză și personalizare. Prelucrarea datelor are loc în conformitate cu Politica de confidențialitate.
acceptă toate configurează respinge