Prehľad dopredu v regulárnych výrazoch PHP
Niekedy je potrebné vyriešiť úlohu tohto typu: nájsť
reťazec 'aaa' a nahradiť ho '!',
ale len vtedy, ak za 'aaa' nasleduje
'x', pričom samotné 'x' sa
nenahrádza. Ak sa pokúsime úlohu vyriešiť
'priamo', nič sa nám nepodarí:
<?php
preg_replace('#aaax#', '!', 'aaax'); // bude '!', ale má byť '!x'
?>
Na vyriešenie úlohy je potrebný spôsob, ako povedať,
že 'x' by sa nemalo nahradiť. Robí sa
to pomocou špeciálnych zátvoriek (?= ),
ktoré len prehliadajú, ale neberú so sebou.
Tieto zátvorky sa nazývajú pozitívny prehľad
dopredu. Pozitívny - pretože 'x'
(v našom prípade) musí byť prítomný - len vtedy
dôjde k nahradeniu.
Použime tieto zátvorky na vyriešenie našej úlohy:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // vráti '!x'
?>
Existuje aj negatívny prehľad dopredu
- (?! ) - ten naopak hovorí, že
niečo by nemalo byť prítomné. V nasledujúcom príklade
k nahradeniu dôjde len vtedy, ak za 'aaa'
nenasleduje 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // vráti '!b'
?>
Daný je reťazec obsahujúci názvy funkcií:
<?php
$str = 'func1() func2() func3()';
?>
Získajte pole mien funkcií z reťazca.
Daný je reťazec s tagom:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Získajte pole mien atribútov tohto tagu.