⊗ppPmRgRCb 260 of 447 menu

Nahrazení s callbackem pomocí regulárních výrazů v PHP

Předpokládejme, že máme následující řetězec:

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

Předpokládejme, že potřebujeme najít všechny konstrukce typu číslo+číslo= a zařídit, aby se za rovnítkem objevil výsledek sčítání.

Pro řešení podobného úkolu je vhodné použít funkci preg_replace_callback, která funguje podobně jako funkce preg_replace - najde a nahradí podle regulárního výrazu, ale umožňuje provádět dodatečné manipulace s nalezenými částmi.

Prvním parametrem funkce přijímá regulární výraz, druhým - na co měníme, třetím - řetězec, ve kterém se nahrazení provádí.

Při tom do druhého parametru by se měla předat funkce-callback, která bude volána pro každou nalezenou shodu.

Jako první parametr callbacku je třeba určit proměnnou, do které se bude nacházet nalezené. Tato proměnná bude představovat pole zachycených skupin (capturing groups).

Zkusme to v praxi. Napišme kód, který zachytí naše podřetězce, přičemž umístí první číslo do první skupiny, a druhé - do druhé:

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

V důsledku náš var_dump se spustí třikrát a postupně vypíše následující:

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

Pokračujeme. Každá shoda bude nahrazena tím, co vrátí callback pomocí return. Pojďme pro příklad nahradit každý z hledaných podřetězců znakem '!':

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

A nyní nahraďme každý podřetězec součtem dvojice čísel v něm:

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

Vychází, že náš úkol je téměř vyřešen. Zbývá zařídit, aby před součtem čísel zůstal hledaný podřetězec. K tomu budeme vkládat před součet obsah nulté skupiny:

<?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; // vypíše '2+3=5 3+5=8 7+8=13' ?>

Je dán řetězec:

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

Nahraďte všechna čísla v řetězci jejich čtverci.

Očekávaný výsledek:

'The numbers are 9, 49 and 144'

Je dán řetězec:

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

Převeďte všechna data do formátu den.měsíc.rok.

Je dán řetězec:

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

Zvyšte všechny ceny o 10%.

Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout