2012-02-05 24 views
8

El siguiente código se usa para encontrar la URL de una cadena con php. Aquí está el código:Buscar url de una cadena con php

$string = "Hello http://www.bytes.com world www.yahoo.com"; 
preg_match('/(http:\/\/[^\s]+)/', $string, $text); 
$hypertext = "<a href=\"". $text[0] . "\">" . $text[0] . "</a>"; 
$newString = preg_replace('/(http:\/\/[^\s]+)/', $hypertext, $string); 
echo $newString; 

Bueno, se muestra un enlace pero si me proporcionan pocos enlace no funciona, y también si escribo sin http: // entonces no muestra enlace. Quiero que se proporcione el enlace que debería estar activo, como stackoverflow.com.

Cualquier ayuda por favor ..

+3

posible duplicado de [PHP: Expresión regular para obtener una URL de una cadena] (http://stackoverflow.com/questions/2720805/php -regular-expression-to-get-a-url-from-a-string) – Gordon

Respuesta

17

Un método de trabajo para la vinculación con HTTP/HTTPS/FTP/FTPS/SCP/scps: $newStr = preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?&_/]+!', "<a href=\"\\0\">\\0</a>",$str);

Yo recomiendo vivamente no vincular cuando sólo tiene un punto, porque considerará enlaces PHP 5.2, ASP.NET, etc., lo cual es difícilmente aceptable.

Actualización: si desea www. cuerdas también, eche un vistazo a this.

+1

bien @axiomer, pero no está activo si escribo www.example.com – user1161867

+0

Actualicé mi solución con un enlace (no lo probé pero debería funcionar, creo). – axiomer

+0

GRACIAS MUCHO. FUNCIONA :)) – user1161867

3

Si quiere detectar algo como stackoverflow.com, entonces tendrá que verificar todos los TLD posibles para descartar algo como Web 2.0, que es bastante long list. Sin embargo, esto también va a coincidir con algo tan ASP.NET etc.

La expresión regular haría es como la siguiente:

$hypertext = preg_replace(
    '{\b(?:http://)?(www\.)?([^\s]+)(\.com|\.org|\.net)\b}mi', 
    '<a href="http://$1$2$3">$1$2$3</a>', 
    $text 
); 

Esto sólo coincide con los dominios que terminan en .com, .org y .net ... como se dijo anteriormente, se tendría que ampliar esta lista para que coincida con todos los TLD

+0

Esto solo funciona para la parte del dominio. Si la cadena incluye directorios y/o archivos, el enlace terminará antes que esos. – doubleJ

0

@axiomer tu ejemplo no funciona si se enlace será en formato:

https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl

solución correcta:

preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?%=&_/]+!', "<a href=\"\\0\">\\0</a>", $content); 

produce:

<a href="https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl">https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl</a>