Lookahead în expresiile regulate PHP
Uneori trebuie să rezolvi o sarcină de acest tip: găsește
șirul 'aaa' și înlocuiește-l cu '!',
dar numai dacă după 'aaa' urmează
'x', iar 'x' în sine
să nu fie înlocuit. Dacă încercăm să rezolvăm sarcina
'direct', nu vom reuși:
<?php
preg_replace('#aaax#', '!', 'aaax'); // va fi '!', dar trebuie '!x'
?>
Pentru a rezolva sarcina, este nevoie de o modalitate de a spune,
că 'x' nu trebuie înlocuit. Acest lucru se face
cu ajutorul unor paranteze speciale (?= ),
care doar se uită, dar nu preiau cu ele.
Aceste paranteze se numesc lookahead pozitiv. Pozitiv - pentru că 'x'
(în cazul nostru) trebuie să fie prezent - doar atunci
va avea loc înlocuirea.
Să aplicăm aceste paranteze pentru a ne rezolva sarcina:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // va returna '!x'
?>
Există și lookahead negativ
- (?! ) - el, dimpotrivă, spune că
ceva nu trebuie să fie. În următorul exemplu
înlocuirea va avea loc doar dacă după 'aaa'
nu urmează 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // va returna '!b'
?>
Este dat un șir care conține nume de funcții:
<?php
$str = 'func1() func2() func3()';
?>
Obțineți un array cu numele funcțiilor din șir.
Este dat un șir cu o etichetă:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Obțineți un array cu numele atributelor acestei etichete.