Lo he intentado hacer con '(?!video)', pero no lo he conseguido.
El problema es que no se dice en qué parte de la cadena de caracteres capturada por el primer par de paréntesis se debe encontrar la palabra 'video'. Se supone entonces que puede aparecer en cualquier parte.
De hecho, el ejemplo indicado por Perl User está marcado como posible error en la explicación de look-ahead, que es justo lo que '(?!...)' indica. Así, '/"(?!video)([^"]+)"/' estamos queriendo decir que lo siguiente a '(?!video)' no ha de ser 'video'. Y, efectivamente, '([^"]+)' es muy probable que no comience con 'video'. No sabemos realmente en qué posición puede estar ese 'video'. Si supiéramos que está en un segundo nivel de directorios, por ejemplo, sí que se podría hacer una expresión regular para ello.
Lo mismo se puede aplicar para look-behind. No sabemos cuántos caracteres pueden existir entre 'video' y la parte anterior.
La recomendación entonces es de hacerlo lo más sencillo posible, claro...
Using perl Syntax Highlighting
if ( $url =~ m{href
="(.+)">(.+)</a
>} and $1 !~ /video/ ) {
print "1: $1\n";
print "2: $2\n";
}
else {
print "1: $1\n";
print "2: $2\n";
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
No es una única expresión regular, pero al menos vemos muy claro qué es lo que estamos buscando.
- Código: Seleccionar todo
$url = '<a href="/story/43480/">The Bottled Water Lie</a>';
devuelve
1: /story/43480/
2: The Bottled Water Lie
$url = '<a href="/story/video/43480/">The Bottled Water Lie</a>';
devuelve
1:
2:
Fíjate que no usamos lo de '[^"]' ni '[^<]' porque lo que rodea a los paréntesis de captura es lo suficientemente expresivo como para que Perl sepa si debe 'encajar' nuestra $url con ese patrón. La clave está en los caracteres fijos que sabemos que sí existen. Sólo tendríamos problemas si $url estuviera compuesta de más de un URL (en la misma línea).
Además, en la parte del 'else', tanto $1 como $2 están indefinidos, que es lo que pedías.
Si quieres dejarlo en una línea:
Using perl Syntax Highlighting
$url =~ m{href
="(.+)">(.+)</a
>} and $1 !~ /video/;
print "[$1] [$2]\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
(tampoco me sorprendería saber que sí se puede hacer con una única expresión regular, pero me temo que podría ser tan larga como la de comprobar si un correo electrónico está correctamente escrito
)