Extraer URL de texto en PHP

Resuelto ahmed asked hace 54 años • 0 respuestas

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.

ahmed avatar Jan 01 '70 08:01 ahmed
Aceptado

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

Nobu avatar Apr 17 '2011 00:04 Nobu

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);
}
Mikael Roos avatar Mar 23 '2012 11:03 Mikael Roos

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.

soulmerge avatar May 26 '2009 14:05 soulmerge

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.

Avatar avatar Apr 12 '2014 06:04 Avatar