Extraer URL de texto en PHP
Tengo este texto:
$string = "this is my friend's website http://example.com I think it is coll";
¿Cómo puedo extraer el enlace a otra variable?
Sé que debería ser especialmente usando expresiones regulares, preg_match()
pero no sé cómo.
Probablemente la forma más segura sea utilizar fragmentos de código de WordPress. Descargue la última versión (actualmente 3.1.1) y consulte wp-includes/formatting.php. Hay una función llamada make_clickable que tiene texto sin formato para el parámetro y devuelve una cadena formateada. Puede obtener códigos para extraer URL. Aunque es bastante complejo.
Esta expresión regular de una línea podría resultar útil.
preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $string, $match);
Pero esta expresión regular aún no puede eliminar algunas URL con formato incorrecto (por ejemplo http://google:ha.ckers.org
).
Ver también: Cómo imitar el comportamiento de enlace automático de StackOverflow
Intenté hacer lo que dijo Nobu, usando Wordpress, pero con muchas dependencias de otras funciones de WordPress, opté por usar la expresión regular de Nobu preg_match_all()
y la convertí en una función, usando preg_replace_callback()
; una función que ahora reemplaza todos los enlaces de un texto con enlaces en los que se puede hacer clic. Utiliza funciones anónimas , por lo que necesitarás PHP 5.3 o puedes reescribir el código para usar una función normal.
<?php
/**
* Make clickable links from URLs in text.
*/
function make_clickable($text) {
$regex = '#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#';
return preg_replace_callback($regex, function ($matches) {
return "<a href=\'{$matches[0]}\'>{$matches[0]}</a>";
}, $text);
}
Las URL tienen una definición bastante compleja : primero debes decidir qué quieres capturar. Un ejemplo simple que captura cualquier cosa que comience con http://
y https://
podría ser:
preg_match_all('!https?://\S+!', $string, $matches);
$all_urls = $matches[0];
Tenga en cuenta que esto es muy básico y podría capturar URL no válidas. Recomendaría ponerse al día con las expresiones regulares POSIX y PHP para cosas más complejas.
El código que funcionó para mí (especialmente si tienes varios enlaces en tu $string
):
$string = "this is my friend's website https://www.example.com I think it is cool, but this one is cooler https://www.stackoverflow.com :)";
$regex = '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i';
preg_match_all($regex, $string, $matches);
$urls = $matches[0];
// go over all links
foreach($urls as $url)
{
echo $url.'<br />';
}
Espero que eso ayude a otros también.