Búsqueda hacia adelante en expresiones regulares de PHP
A veces necesitamos resolver una tarea de este tipo: encontrar
la cadena 'aaa' y reemplazarla por '!',
pero solo si después de 'aaa' hay
'x', y sin reemplazar la propia 'x'.
Si intentamos resolver la tarea
'directamente', no tendremos éxito:
<?php
preg_replace('#aaax#', '!', 'aaax'); // será '!', pero debería ser '!x'
?>
Para resolver la tarea, se necesita una forma de decir
que 'x' no debe ser reemplazada. Esto se hace
usando corchetes especiales (?= ),
que solo verifican, pero no consumen caracteres.
Estos corchetes se llaman búsqueda positiva hacia adelante.
Positiva - porque 'x'
(en nuestro caso) debe estar presente - solo entonces
ocurrirá el reemplazo.
Apliquemos estos corchetes para resolver nuestra tarea:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // retornará '!x'
?>
También existe la búsqueda negativa hacia adelante
- (?! ) - que, por el contrario, dice que
algo no debe estar presente. En el siguiente ejemplo
el reemplazo ocurrirá solo si después de 'aaa'
no hay 'x':
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // retornará '!b'
?>
Se da una cadena que contiene nombres de funciones:
<?php
$str = 'func1() func2() func3()';
?>
Obtenga un array con los nombres de las funciones de la cadena.
Se da una cadena con una etiqueta:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
Obtenga un array con los nombres de los atributos de esta etiqueta.