Lookahead em expressões regulares do PHP
Às vezes, é necessário resolver um problema do tipo: encontrar
a string 'aaa' e substituí-la por '!',
mas apenas se depois de 'aaa' houver
'x', sem substituir o próprio 'x'.
Se tentarmos resolver o problema
'diretamente', não conseguiremos:
<?php
preg_replace('#aaax#', '!', 'aaax'); // retornará '!', mas deveria ser '!x'
?>
Para resolver a tarefa, é necessária uma maneira de dizer
que o 'x' não deve ser substituído. Isto é feito
usando colchetes especiais (?= ),
que apenas verificam, mas não capturam.
Esses colchetes são chamados de lookahead positivo.
Positivo - porque o 'x'
(no nosso caso) deve estar presente - só então
a substituição ocorrerá.
Vamos aplicar esses colchetes para resolver nossa tarefa:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // retornará '!x'
?>
Existe também o lookahead negativo
- (?! ) - que, pelo contrário, diz que
algo não deve estar presente. No próximo exemplo,
a substituição ocorrerá apenas se depois de 'aaa'
não houver 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // retornará '!b'
?>
Dada uma string contendo nomes de funções:
<?php
$str = 'func1() func2() func3()';
?>
Obtenha um array com os nomes das funções a partir da string.
Dada uma string com uma tag:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Obtenha um array com os nomes dos atributos desta tag.