htmlentities - php url decode
¿Cómo puedo vincular URL en una cadena con php? (9)
Tengo la siguiente cadena:
"Look on http://www.google.com".
Necesito convertirlo a:
"Buscar en http://www.google.com "
La cadena original puede tener más de 1 cadena de URL.
¿Cómo hago esto en php?
Gracias
Corregir correctamente una URL no es trivial. (Consulte: http://www.codinghorror.com/blog/2008/10/the-problem-with-urls.html para obtener más información sobre por qué esto es así.) Pasé bastante tiempo en esto y he venido con una solución bastante buena para el problema (tanto para PHP como para Javascript). Ver: http://jmrware.com/articles/2010/linkifyurl/linkify.html
Eche un vistazo a las expresiones regulares . Entonces harías algo like :
$text = preg_replace(''@(https?://([-/w/.]+)+(:/d+)?(/([/w/_/.]*(/?/S+)?)?)?)@'', ''<a href="$1">$1</a>'', $text);
Encontré este código en http://code.seebz.net/p/autolink-php/ y lo modifiqué un poco para reconocer www. * Como enlaces. No estoy muy familiarizado con las expresiones regulares, pero creo que las dos líneas str_replace se pueden modificar a una expresión regular
<?php
$text = ''First link is: www.example.com. Second link is http://example.com. Third link is https://example.com. Fourth link is http://www.example.com. Fifth link is <a href="http://www.example.com">www.example.com</a>'';
function autolink($str, $attributes=array()) {
$str = str_replace("http://www","www",$str);
$str = str_replace("https://www","www",$str);
$attrs = '''';
foreach ($attributes as $attribute => $value) {
$attrs .= " {$attribute}=/"{$value}/"";
}
$str = '' '' . $str;
$str = preg_replace(
''`([^"=/'>])((http|https|ftp)://[^/s<]+[^/s</.)])`i'',
''$1<a href="$2"''.$attrs.''>$2</a>'',
$str
);
$str = preg_replace(
''`([^"=/'>])((www).[^/s<]+[^/s</.)])`i'',
''$1<a href="http://$2"''.$attrs.''>$2</a>'',
$str
);
$str = substr($str, 1);
return $str;
}
echo autolink($text);
?>
Encontré un ejemplo que permite enlaces que incluyen ftp, https y otros que parecen funcionar bien para múltiples URL
how-to-detect-urls-in-text-and-convert-to-html-links-php-using-regular-expressions
<?php
// The Regular Expression filter
$pattern = "/(http|https|ftp|ftps)/:////[a-zA-Z0-9/-/.]+/.[a-zA-Z]{2,3}(///S*)?/";
//example text
$text="Example user text with a URL http://www.zero7web.com , second link http://www.didsburydesign.co.uk";
// convert URLs into Links
$text= preg_replace($pattern, "<a href=/"//0/" rel=/"nofollow/">//0</a>", $text);
echo $text;
?>
Probablemente una buena idea para añadir nofollow al enlace también es un valor enviado por el usuario.
Necesitarás usar expresiones regulares ...
Algo como esto ayudará.
$result = preg_replace(''//b(https?|ftp|file):////[-A-Z0-9+&@#//%?=~_|!:,.;]*[A-Z0-9+&@#//%=~_|]/i'', ''<a href="/0">/0</a>'', $text);
Prueba esto...
<?
function link_it($text)
{
$text= preg_replace("/(^|[/n ])([/w]*?)([/w]*?:////[/w]+[^ /,/"/n/r/t<]*)/is", "$1$2<a href=/"$3/" >$3</a>", $text);
$text= preg_replace("/(^|[/n ])([/w]*?)((www)/.[^ /,/"/t/n/r<]*)/is", "$1$2<a href=/"http://$3/" >$3</a>", $text);
$text= preg_replace("/(^|[/n ])([/w]*?)((ftp)/.[^ /,/"/t/n/r<]*)/is", "$1$2<a href=/"ftp://$3/" >$3</a>", $text);
$text= preg_replace("/(^|[/n ])([a-z0-9&/-_/.]+?)@([/w/-]+/.([/w/-/.]+)+)/i", "$1<a href=/"mailto:$2@$3/">$2@$3</a>", $text);
return($text);
}
$text = "ini link gue: http://sapua.com <br>
https://sapua.com <br>
anything1://www.sss.com <br>
dua www.google.com <br>
tiga http://www.google.com <br>
ftp.sapua.com <br>
[email protected]
";
print link_it($text);
?>
Puedes usar lo siguiente:
$string = "Look on http://www.google.com";
$string = preg_replace(
"~[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]~",
"<a href=/"//0/">//0</a>",
$string);
Versiones de PHP <5.3 (ereg_replace) de lo contrario (preg_replace)
Revisa mi función linkify, que usa preg_replace_callback (PHP 5.3 solamente). Es compatible con http, correo electrónico y Twitter:
http://www.jasny.net/articles/linkify-turning-urls-into-clickable-links-in-php/
/**
* Turn all URLs in clickable links.
*
* @param string $value
* @param array $protocols http/https, ftp, mail, twitter
* @param array $attributes
* @param string $mode normal or all
* @return string
*/
function linkify($value, $protocols = array(''http'', ''mail''), array $attributes = array(), $mode = ''normal'')
{
// Link attributes
$attr = '''';
foreach ($attributes as $key => $val) {
$attr = '' '' . $key . ''="'' . htmlentities($val) . ''"'';
}
$links = array();
// Extract existing links and tags
$value = preg_replace_callback(''~(<a .*?>.*?</a>|<.*?>)~i'', function ($match) use (&$links) { return ''<'' . array_push($links, $match[1]) . ''>''; }, $value);
// Extract text links for each protocol
foreach ((array)$protocols as $protocol) {
switch ($protocol) {
case ''http'':
case ''https'': $value = preg_replace_callback($mode != ''all'' ? ''~(?:(https?)://([^/s<]+)|(www/.[^/s<]+?/.[^/s<]+))(?<![/.,:])~i'' : ''~([^/s<]+/.[^/s<]+)(?<![/.,:])~i'', function ($match) use ($protocol, &$links, $attr) { if ($match[1]) $protocol = $match[1]; $link = $match[2] ?: $match[3]; return ''<'' . array_push($links, ''<a'' . $attr . '' href="'' . $protocol . ''://'' . $link . ''">'' . $link . ''</a>'') . ''>''; }, $value); break;
case ''mail'': $value = preg_replace_callback(''~([^/s<]+?@[^/s<]+?/.[^/s<]+)(?<![/.,:])~'', function ($match) use (&$links, $attr) { return ''<'' . array_push($links, ''<a'' . $attr . '' href="mailto:'' . $match[1] . ''">'' . $match[1] . ''</a>'') . ''>''; }, $value); break;
case ''twitter'': $value = preg_replace_callback(''~(?<!/w)[@#](/w++)~'', function ($match) use (&$links, $attr) { return ''<'' . array_push($links, ''<a'' . $attr . '' href="https://twitter.com/'' . ($match[0][0] == ''@'' ? '''' : ''search/%23'') . $match[1] . ''">'' . $match[0] . ''</a>'') . ''>''; }, $value); break;
default: $value = preg_replace_callback($mode != ''all'' ? ''~'' . preg_quote($protocol, ''~'') . ''://([^/s<]+?)(?<![/.,:])~i'' : ''~([^/s<]+)(?<![/.,:])~i'', function ($match) use ($protocol, &$links, $attr) { return ''<'' . array_push($links, ''<a'' . $attr . '' href="'' . $protocol . ''://'' . $match[1] . ''">'' . $match[1] . ''</a>'') . ''>''; }, $value); break;
}
}
// Insert all link
return preg_replace_callback(''/<(/d+)>/'', function ($match) use (&$links) { return $links[$match[1] - 1]; }, $value);
}
lib_autolink
hace un buen trabajo, evitando riesgos como la puntuación extra después del enlace y los enlaces dentro de las etiquetas HTML: