⊗ppPmRgRCb 260 of 447 menu

Asendamine tagasikutsega regulaaravaldiste abil PHP-s

Olgu meil järgmine string:

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

Oletame, et peame leidma kõik konstruktsioonid kujul arv+arv= ja tegema nii, et võrdusmärgi järele ilmub liitmise tulemus.

Sellise ülesande lahendamiseks on mugav kasutada funktsiooni preg_replace_callback, mis töötab sarnaselt funktsioonile preg_replace - leiab ja asendab regulaaravaldise abil, kuid võimaldab teha täiendavaid manipuleerimisi leitud tükkidega.

Esimese parameetrina võtab funktsioon regulaaravaldise, teise - millega asendada, kolmanda - stringi, milles asendamine toimub.

Sel juhul tuleks teise parameetrina edastada tagasikutse funktsioon, mida kutsutakse välja iga leitud vastet puhul.

Tagasikutse esimeseks parameetriks tuleb määrata muutuja, kuhu leitu satub. See muutuja on massiiv leitud gruppidest (pocket).

Proovime seda praktikas. Kirjutame koodi, mis püüab meie alamstringid kinni, pannes esimese numbri esimesse gruppi ja teise - teise gruppi:

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

Selle tulemusena töötab meie var_dump kolm korda, näidates järjest järgmist:

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

Läheme edasi. Iga leitud vaste asendatakse sellega, mida tagasikutse tagastab läbi return. Teeme näiteks iga otsitava alamstringi asendamise märgiga '!':

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

Nüüd asendame iga alamstringi numbripaari summaga:

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

Selgub, et meie ülesanne on peaaegu lahendatud. Jääb teha vaid nii, et numbrite summa ees jääks alles otsitav alamstring. Selleks paneme summa ette nullindasse gruppi kuuluva sisu:

<?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; // väljund '2+3=5 3+5=8 7+8=13' ?>

Antud string:

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

Asendage kõik stringis olevad numbrid nende ruutudega.

Oodatav tulemus:

'The numbers are 9, 49 and 144'

Antud string:

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

Teisendage kõik kuupäevad vormingusse päev.kuu.aasta.

Antud string:

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

Suurendage kõiki hindu 10% võrra.

Eesti
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Me kasutame saidi toimimiseks, analüüsi ja personaliseerimiseks küpsiseid. Andmete töötlemine toimub vastavalt Privaatsuspoliitikale.
nõustu kõigega häälesta keeldu