⊗ppPmRgRCb 260 of 447 menu

Korvaus callbackilla säännöllisillä lausekkeilla PHP:ssä

Oletetaan, että meillä on seuraava merkkijono:

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

Oletetaan, että haluamme löytää kaikki muotoa luku+luku= olevat rakenteet ja tehdä niin, että yhtäläisyysmerkin jälkeen ilmestyy summauksen tulos.

Tällaisen ongelman ratkaisemiseksi on kätevää käyttää funktiota preg_replace_callback, joka toimii samalla tavalla kuin funktio preg_replace - löytää ja korvaa säännöllisellä lausekkeella, mutta mahdollistaa lisämanipulaatiot löydetyillä osilla.

Ensimmäisenä parametrina funktio ottaa vastaan säännöllisen lausekkeen, toisena - mihin korvataan, kolmantena - merkkijonon, jossa korvaus suoritetaan.

Toiseen parametriin tulee siis välittää callback-funktio, jota kutsutaan jokaisesta löydetystä osumasta.

Callback-funktion ensimmäiseksi parametriksi on määritettävä muuttuja, johon löydetty osa tulee. Tämä muuttuja on taulukko löydetyn osan tallennuspaikoista (capture groups).

Kokeillaan käytännössä. Kirjoitetaan koodi, joka naputtaa meidän merkkijononsa, ja samalla laittaa ensimmäisen luvun ensimmäiseen tallennuspaikkaan ja toisen - toiseen:

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

Tuloksena meidän var_dump toimii kolme kertaa, tulostaen vuorotellen seuraavaa:

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

Mennään pidemmälle. Jokainen osuma korvataan siihen, minkä callback-funktio palauttaa return:lla. Korvataan esimerkiksi jokainen etsityistä merkkijonoista merkillä '!':

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

Ja nyt korvataan jokainen merkkijono parien lukujen summalla:

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

Saamme siis, että tehtävämme on melkein ratkaistu. Jää vielä tehdä niin, että ennen lukujen summaa säilyy etsitty merkkijono. Tätä varten lisäämme ennen summaa nollannen tallennuspaikan sisällön:

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

Annettu merkkijono:

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

Korvaa kaikki merkkijonon luvut niiden neliöillä.

Odotettu tulos:

'The numbers are 9, 49 and 144'

Annettu merkkijono:

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

Muunna kaikki päivämäärät muotoon päivä.kuukausi.vuosi.

Annettu merkkijono:

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

Kasvata kaikkia hintoja 10%:lla.

Suomi
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Käytämme evästeitä verkkosivuston toiminnalle, analytiikalle ja personoinnille. Tietojen käsittely tapahtuu Tietosuojakäytännön mukaisesti.
hyväksy kaikki mukauta hylkää