2009-05-26 23 views
34

que tienen este texto:Extraer URL de texto en PHP

$string = "this is my friend's website http://example.com I think it is coll"; 

¿Cómo puedo extraer el enlace en otra variable?

Sé que debería ser mediante el uso de la expresión regular especialmente preg_match() pero no sé cómo?

+1

posible duplicado de [Extraer URL de la cadena] (http://stackoverflow.com/questions/4390556/extract-url-from-string) –

+3

@ Michael Berkowski cómo será duplicado el usuario preguntó el 26 de mayo de 2009 a las 14:13 pero el enlace mencionado por usted lo solicitó en diciembre 8'10 a las 17:44. Puede ser lo contrario puede ser cierto. – gvgvgvijayan

Respuesta

3
preg_match_all('/[a-z]+:\/\/\S+/', $string, $matches); 

Esta es una manera fácil que funcionaría para muchos casos, no para todos. Todos los partidos se ponen en $ matches. Tenga en cuenta que esto no cubre los enlaces en los elementos de anclaje (< a href = "" ...), pero tampoco en su ejemplo.

+1

-1: acaba de crear una vulnerabilidad XSS, ya que también extraería javascript: URLs. –

+0

No se dice para qué lo usaría, por lo tanto, no explico eso. Solo quería que las URL se convirtieran en variables. – runfalk

+2

@Michael: Encontrar URL de JavaScript aún no es una vulnerabilidad; usarlos sin ningún control es. A veces, la presencia y el número de tales URL es información útil. Hubiera elegido un delimitador diferente. :) – fuxia

9

Las URL tienen bastante complex definition - primero debe decidir qué desea capturar. Un ejemplo sencillo de capturar cualquier cosa que empiece 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 las direcciones URL no válidas. Recomiendo ponerse al día en POSIX y PHP regular expressions para cosas más complejas.

+0

Esto funciona perfectamente para mí. ¡Gracias! –

8

Si el texto del que extraes las URL es enviado por el usuario y vas a mostrar el resultado como enlaces en cualquier lugar, debes ser MUY cuidadoso para evitar XSS vulnerabilities, especialmente las URL del protocolo "javascript:". pero también malformed URLs que podría engañar a su expresión regular y/o al navegador de visualización para que se ejecuten como URL Javascript. Como mínimo, debe aceptar solo URL que comiencen con "http", "https" o "ftp".

También hay un blog entry de Jeff donde describe algunos otros problemas con la extracción de URL.

43

Probablemente la forma más segura es usar fragmentos de código de WordPress. Descargue la última (actualmente 3.1.1) y vea wp-includes/formatting.php. Hay una función llamada make_clickable que tiene texto simple para param y devuelve una cadena formateada. Puede obtener códigos para extraer URL. Aunque es bastante complejo.

Esta regex de una línea podría ser útil.

preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $string, $match); 

Pero esta expresión regular todavía no puede eliminar algunas de las URL con formato incorrecto (ej. http://google:ha.ckers.org).

Consulte también: How to mimic StackOverflow Auto-Link Behavior

+3

Tuve un juego con el formato WordPress.php y usar make_clickable es una buena idea, pero termina absorbiendo la mitad de wordpress en dependencias. –

+0

Bueno, para asegurarse de que la parte terminal no sea un personaje extraño – Miguel

+0

Esto no identifica la URL sin http, como google.com –

2
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+". 
       "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/", 
       $var, &$matches); 

$matches = $matches[1]; 
$list = array(); 

foreach($matches as $var) 
{  
    print($var."<br>"); 
} 
13

Traté de hacer lo que dijo Nobu, utilizando Wordpress, pero a mucha dependencias a otras funciones de WordPress Yo en cambio optó por usar una expresión regular de Nobu para preg_match_all() y lo convirtió en una función, usando preg_replace_callback(); una función que ahora reemplaza todos los enlaces en un texto con enlaces clicables. Utiliza anonymous functions, por lo que necesitará PHP 5.3 o puede 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); 
} 
+2

Solo una nota: he actualizado su respuesta para usar una función anónima como devolución de llamada en lugar de usando 'create_function()'. –

5

Lo que puedes hacer como ..

<?php 
$string = "this is my friend's website http://example.com I think it is coll"; 
echo explode(' ',strstr($string,'http://'))[0]; //"prints" http://example.com 
5

El código que funcionó para mí (especialmente si tiene varios eslabones de la cadena $) es:

$string = "this is my friend's website http://example.com I think it is cool, but this is cooler http://www.memelpower.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 />'; 
} 

Esperanza que ayuda a los demás.

+0

He probado todas las respuestas, esta es solo una eliminará la pestaña html – hkguile

1

Puede intentar esto para encontrar el enlace y revisar el enlace (agregue el enlace href).

$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; 

// The Text you want to filter for urls 
$text = "The text you want to filter goes here. http://note.taable.com"; 

if(preg_match($reg_exUrl, $text, $url)) { 

     echo preg_replace($reg_exUrl, "<a href="{$url[0]}">{$url[0]}</a> ", $text); 

} else { 

     echo "No url in the text"; 

} 

se refieren aquí: http://php.net/manual/en/function.preg-match.phpsocialnews

0

Esta expresión regular funciona muy bien para mí y he comprobado con todos los tipos de URL,

<?php 
$string = "Thisregexfindurlhttp://www.rubular.com/r/bFHobduQ3n mixedwithstring"; 
preg_match_all('/(https?|ssh|ftp):\/\/[^\s"]+/', $string, $url); 
$all_url = $url[0]; // Returns Array Of all Found URL's 
$one_url = $url[0][0]; // Gives the First URL in Array of URL's 
?> 

cuadros con una gran cantidad de URL de puede encontrar aquí http://www.rubular.com/r/bFHobduQ3n

0
public function find_links($post_content){ 
    $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; 
    // Check if there is a url in the text 
    if(preg_match_all($reg_exUrl, $post_content, $urls)) { 
     // make the urls hyper links, 
     foreach($urls[0] as $url){ 
      $post_content = str_replace($url, '<a href="'.$url.'" rel="nofollow"> LINK </a>', $post_content); 
     } 
     //var_dump($post_content);die(); //uncomment to see result 
     //return text with hyper links 
     return $post_content; 
    } else { 
     // if no urls in the text just return the text 
     return $post_content; 
    } 
}