Lookahead nelle espressioni regolari di PHP
A volte è necessario risolvere un problema di questo tipo: trovare
la stringa 'aaa' e sostituirla con '!',
ma solo se dopo 'aaa' c'è
'x', e 'x' stesso
non deve essere sostituito. Se proviamo a risolvere il problema
in modo diretto, non avremo successo:
<?php
preg_replace('#aaax#', '!', 'aaax'); // darà '!', ma dovrebbe essere '!x'
?>
Per risolvere il problema, è necessario un modo per dire
che 'x' non deve essere sostituito. Questo si fa
utilizzando parentesi speciali (?= ),
che semplicemente controllano, ma non "consumano" i caratteri.
Queste parentesi sono chiamate lookahead positivo.
Positivo - perché 'x'
(nel nostro caso) deve esserci - solo allora
avverrà la sostituzione.
Applichiamo queste parentesi per risolvere il nostro problema:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // restituirà '!x'
?>
Esiste anche il lookahead negativo
- (?! ) - che, al contrario, dice che
qualcosa non deve esserci. Nell'esempio seguente
la sostituzione avverrà solo se dopo 'aaa'
non c'è 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // restituirà '!b'
?>
Data una stringa contenente nomi di funzioni:
<?php
$str = 'func1() func2() func3()';
?>
Ottieni un array dei nomi delle funzioni dalla stringa.
Data una stringa con un tag:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Ottieni un array dei nomi degli attributi di questo tag.