Lookahead w wyrażeniach regularnych PHP
Czasami trzeba rozwiązać zadanie tego typu: znaleźć
ciąg 'aaa' i zamienić go na '!',
ale tylko jeśli po 'aaa' znajduje się
'x', przy czym samego 'x'
nie zamieniamy. Jeśli spróbujemy rozwiązać zadanie
'bezpośrednio', nic nam nie wyjdzie:
<?php
preg_replace('#aaax#', '!', 'aaax'); // będzie '!', a ma być '!x'
?>
Aby rozwiązać zadanie, potrzebny jest sposób na
powiedzenie, że 'x' nie powinno być
zastępowane. Robi się to za pomocą specjalnych
nawiasów (?= ), które tylko sprawdzają,
ale nie pobierają ze sobą.
Te nawiasy nazywają się pozytywny przegląd
naprzód. Pozytywny - ponieważ 'x'
(w naszym przypadku) musi być - tylko wtedy
nastąpi zamiana.
Zastosujmy te nawiasy do rozwiązania naszego zadania:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // zwróci '!x'
?>
Istnieje też negatywny przegląd naprzód
- (?! ) - który, przeciwnie, mówi, że
czegoś nie powinno być. W następnym przykładzie
zamiana nastąpi tylko, jeśli po 'aaa'
nie znajduje się 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // zwróci '!b'
?>
Dany jest ciąg zawierający nazwy funkcji:
<?php
$str = 'func1() func2() func3()';
?>
Pobierz tablicę nazw funkcji z ciągu.
Dany jest ciąg z tagiem:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Pobierz tablicę nazw atrybutów tego tagu.