php - solo - strip_tags wordpress
Necesita una buena expresión regular para convertir URL en enlaces, pero deje los enlaces existentes solo (6)
Tengo una carga de contenido enviado por el usuario. Es HTML y puede contener URL. Algunos de ellos ya lo estarán <a>
(si el usuario es bueno) pero a veces los usuarios son flojos y simplemente escriben www.something.com o en el mejor de los casos http://www.something.com .
No puedo encontrar una expresión regular decente para capturar las URL, pero ignoro las que están inmediatamente a la derecha de una comilla doble o ''>''. ¿Alguien tiene uno?
Enchufe desvergonzado: puede mirar aquí ( expresión regular reemplazar una palabra por un enlace ) en busca de inspiración.
La pregunta solicitó reemplazar algunas palabras con un cierto enlace, a menos que ya haya un enlace. Entonces, el problema que tienes es más o menos lo mismo.
Todo lo que necesita es una expresión regular que coincida con una URL (en lugar de la palabra). La suposición más simple sería la siguiente: una URL (opcionalmente) comienza con "http://"
, "ftp://"
o "mailto:"
y dura mientras no haya espacios en blanco, saltos de línea, etiqueta corchetes o citas).
Cuidado, larga expresión regular por delante. Aplicar sin distinción de mayúsculas y minúsculas.
(href/s*=/s*[''"]?)?((?:http://|ftp://|mailto:)?[^.,<>"''/s/r/n/t]+(?:/.(?![.<>"''/s/r/n])[^.,!<>"''/s/r/n/t]+)+)
Tenga cuidado: esto también coincidirá con las URL que técnicamente no son válidas, y reconocerá cosas. Formateado. Como esta, como una URL. Depende de tus datos si es demasiado insensible. Puedo ajustar la expresión regular si tiene ejemplos donde devuelve falsos positivos.
La expresión regular producirá dos grupos de coincidencia. El Grupo 2 contendrá la coincidencia, que probablemente sea una URL. El grupo 1 contendrá una cadena vacía o un ''href="''
. Puede usarlo como un indicador de que esta coincidencia se produjo dentro de un parámetro href de un enlace existente y no es necesario que lo toque.
Una vez que confirme que esto hace lo correcto la mayor parte del tiempo (con los datos proporcionados por el usuario, nunca puede estar seguro), puede hacer el resto en dos pasos, como lo propuse en la otra pregunta:
- Haga un enlace alrededor de cada URL que existe (¡a menos que haya algo en el grupo de coincidencias 1!) Esto generará dobles etiquetas anidadas
<a>
para las cosas que ya tienen un enlace. - Escanee las etiquetas
<a>
incorrectamente anidadas, eliminando la más interna
Este hilo es antiguo como las colinas, pero lo encontré mientras trabajaba en mi propio problema: es decir, convertir cualquier URL en enlaces, pero deja en paz a cualquiera que ya esté dentro de las etiquetas de anclaje. Después de un tiempo, esto es lo que surgió:
(?!(?!.*?<a)[^<]*<//a>)(?:(?:https?|ftp|file)://|www/.|ftp/.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]
Con la siguiente entrada:
http://www.google.com
http://google.com
www.google.com
<p>http://www.google.com<p>
this is a normal sentence. let''s hope it''s ok.
<a href="http://www.google.com">www.google.com</a>
Este es el resultado de una preg_replace:
<a href="http://www.google.com" rel="nofollow">http://www.google.com</a>
<a href="http://google.com" rel="nofollow">http://google.com</a>
<a href="www.google.com" rel="nofollow">www.google.com</a>
<p><a href="http://www.google.com" rel="nofollow">http://www.google.com</a><p>
this is a normal sentence. let''s hope it''s ok.
<a href="http://www.google.com">www.google.com</a>
Solo quería contribuir para salvar a alguien en algún momento.
Hice una pequeña modificación a la Regex contenida en la respuesta original:
(?<![.*">])/b(?:(?:https?|ftp|file)://|[a-z]/.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]
que permite más subdominios y también ejecuta un control más completo de las etiquetas. Para aplicar esto a PHP preg replace, puedes usar:
$convertedText = preg_replace( ''@(?<![.*">])/b(?:(?:https?|ftp|file)://|[a-z]/.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i'', ''<a href="/0" target="_blank">/0</a>'', $originalText );
Tenga en cuenta que eliminé @ de la expresión regular para usarlo como delimitador para preg_replace. Es bastante raro que @ se use en una URL de todos modos.
Obviamente, puede modificar el texto de reemplazo y eliminar target = "_ blank", o agregar rel = "nofollow", etc.
Espero que ayude.
Jan Goyvaerts, creador de RegexBuddy , ha escrito una respuesta al blog de Jeff Atwood que aborda los problemas que tuvo Jeff y ofrece una buena solución.
/b(?:(?:https?|ftp|file)://|www/.|ftp/.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]
Para ignorar las coincidencias que ocurren justo al lado de "o", puede agregar (?<![">])
comienzo de la expresión regular, para que obtenga
(?<![">])/b(?:(?:https?|ftp|file)://|www/.|ftp/.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]
Esto coincidirá con direcciones completas ( http: // ... ) Y direcciones que comienzan con www. o ftp. - no tienes suerte con direcciones como ars.userfriendly.org ...
Para omitir los existentes simplemente use un look-behind - add (?<!href=")
al principio de su expresión regular, por lo que se vería algo así:
/(?<!href=")http:///S*/
Obviamente, esta no es una solución completa para encontrar todo tipo de URL, pero esto debería resolver su problema de problemas con los existentes.
if (preg_match(''//b(?<!=")(https?|ftp|file):////[-A-Z0-9+&@#//%?=~_|!:,.;]*[A-Z0-9+&@#//%=~_|](?!.*".*>)(?!.*<//a>)/i'', $subject)) {
# Successful match
} else {
# Match attempt failed
}