Pohled vpřed v regulárních výrazech PHP
Někdy je třeba vyřešit úlohu tohoto typu: najít
řetězec 'aaa' a nahradit jej '!',
ale pouze pokud za 'aaa' následuje
'x', přičemž samotné 'x'
přitom nenahrazovat. Pokusíme-li se úlohu vyřešit
'přímo', nic se nám nepovede:
<?php
preg_replace('#aaax#', '!', 'aaax'); // bude '!', ale má být '!x'
?>
K vyřešení úlohy je potřebný způsob, jak říct,
že 'x' by se nemělo nahrazovat. Dělá se
to pomocí speciálních závorek (?= ),
které pouze 'dívají', ale neberou si s sebou.
Tyto závorky se nazývají pozitivní pohled vpřed. Pozitivní - protože 'x'
(v našem případě) musí být - pouze tehdy
dojde k nahrazení.
Aplikujme tyto závorky pro řešení naší úlohy:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // vrátí '!x'
?>
Existuje i negativní pohled vpřed
- (?! ) - ten naopak říká, že
něco by nemělo být. V následujícím příkladu
dojde k nahrazení, pouze pokud za 'aaa'
nenásleduje 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // vrátí '!b'
?>
Je dán řetězec obsahující názvy funkcí:
<?php
$str = 'func1() func2() func3()';
?>
Získejte pole názvů funkcí z řetězce.
Je dán řetězec s tagem:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Získejte pole názvů atributů tohoto tagu.