php - probar - enlaces de correspondencias de expresiones regulares sin etiqueta<a>
expresiones regulares php (2)
(http([s]?):////?)(([a-zA-Z0-9]+(/.?))+)([a-zA-Z0-9]+((/.[a-zA-Z]{2,5}){1,2})((//[a-zA-Z0-9/?&=_/-/~:/?#[/]@!/$&''()/*/+,;]*)*)((/.[a-zA-Z]{2,5}){0,2}))
Esta es mi expresión regular, que funciona bien para hacer coincidir los enlaces de la cadena. Pero no quiero que seleccione todos los enlaces. Si un enlace tiene ">
antes" o </a>
después de él, ese enlace no se debe calcular. ¿Cómo se puede hacer?
Estos deben ser emparejados:
adasdas http://www.stackoverflow.com asdasas
adasdasahttp://www.stackoverflow.com/something asdas
Estos NO deberían coincidir:
adasdas<a href="somelink"> http://www.stackoverflow.com </a>asdasas
adasdasa<a href="somelink">http://www.stackoverflow.com/something</a> asdas
¿Por qué necesito esto ?: Quiero que se pueda hacer clic en cada enlace, incluso si no está entre las etiquetas de anclaje.
Con todas las negaciones sobre el uso de regex para analizar html, si desea usar regex para esta tarea, esto funcionará:
$regex="~<a.*?</a>(*SKIP)(*F)|http:///S+~";
Vea la demostración .
Este problema es un caso clásico de la técnica explicada en esta pregunta para "emparejar de forma regular un patrón, excluyendo ..."
El lado izquierdo de la alternancia |
coincide con las <a ...tags </a>
completas <a ...tags </a>
luego falla deliberadamente, luego de lo cual el motor salta a la siguiente posición de la cuerda. El lado derecho coincide con las URL, y sabemos que son las correctas porque no se correspondían con la expresión de la izquierda.
La URL regex que puse a la derecha y puede ser refinada, solo use lo que se ajuste a sus necesidades.
Referencia
- Cómo hacer coincidir (o reemplazar) un patrón, excepto en las situaciones s1, s2, s3 ...
- Artículo sobre emparejar un patrón a menos que ...
Necesitas agregar lookaround
s a tu regex cf:
- Expresión regular lookahead negativo
- Mira hacia adelante y mira hacia atrás afirmaciones de longitud cero