Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Beraldo

Transformar URLs de um texto em links

Recommended Posts

Saudações, pessoal! :)

 

Resolvi criar uma função que transformasse em links URLs de um texto. Está funcionando bem, mas se quiserem aprimorar a função, fiquem à vontade. Sugestões e críticas serão bem-vindas.

 

Não manjo muito de ERs, por enquanto, então talvez a que utilizei possa ser melhorada.

 

Se a URL for muito grande, a função também a reduz.

 

 

código da função (última atualização: 25/06/2007)

<?php
#############################################
#										   #
#  Autor: Roberto Beraldo Chaiben (Beraldo) #
#   E-Mail : rbchaiben[arroba]yahoo.com.br  #
#										   #
#############################################

/*
   string MontarLink (string texto)
  
   A função MontarLink() transforma em links as URLs iniciadas por 'http://' ou 'https://' contidas no argumento 'texto'.
   Se a URL tiver mais que 60 caracteres, serão exibidos os 25 primeiros, seguidos de reticências (...) e os últimos 15.
  
   IMPORTANTE: Se o link se iniciar por 'www' e não tiver 'http://' ou 'https://', a função não surtirá efeito.
*/


function MontarLink($texto)
{
	if (!is_string($texto))
		return $texto;
	  
	$er = "/(http(s)?:\/\/(www|.*?\/)?((\.|\/)?[a-zA-Z0-9&%_?=-]+)+)/i";
	preg_match_all($er, $texto, $match);
	
	foreach ($match[0] as $link)
	{
		$link = strtolower($link);
		$link_len = strlen($link);
		
		//troca "&" por "&", tornando o link válido pela W3C
		$web_link = str_replace("&", "&", $link);
		
		$texto = str_ireplace($link, "<a href=\"" . $web_link . "\" target=\"_blank\" title=\"". $web_link . "\" rel=\"nofollow\">". (($link_len > 60) ? substr($web_link, 0, 25) . "..." . substr($web_link, -15) : $web_link) . "</a>", $texto);
		
	}
	
	return $texto;
}
?>

Um exemplo de como funciona:

$a = "O link http://www.Trova.Di.danu é Metal! http://www.Tuatha.de.danann também é metal!";
echo "<p>" . MontarLink ($a) . "</p>\r\n";
$b = "O link http://www.master.of.puppets.that.should.not.be/index.php?id=7&x=y parece interessante.";
echo "<p>" . MontarLink ($b) . "</p>\r\n";
$c = "O link http://www.MetropolisPt2.Scenes.from.a.memory/regression/Overture1928 também parece ótimo";
echo "<p>" . MontarLink ($c) . "</p>\r\n";

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

só pra constar sua função nao ta funcionando com links do localhost

 

e vou indicar um função relacionada e util:

 

http://br.php.net/manual/en/function.http-build-query.php

 

exemplo:

$query = array('pagina' => '1',
		 'secao' => 'a',
		 'tema' => 'abc',
		 'idioma' => 'portugues');

echo http_build_query($data);//pagina=1&secao=a&tema=abc&idioma=portugues

 

dai voce pode ate usar em junto com sua função =)

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

só pra constar sua função nao ta funcionando com links do localhost

Boa observaçào, Fabyo. Que falha feia... :lol:

 

Podemos trocar:

$er = "/http:\/\/(www\.)?([a-zA-Z0-9]+|_|-)+(\.(([0-9a-zA-Z]|-|_|\/|\?|=|&)+))+/i";
por

$er = "/http:\/\/(www\.|.*?\/)?([a-zA-Z0-9]+|_|-)+(\.(([0-9a-zA-Z]|-|_|\/|\?|=|&)+))+/i";
Isso faz um domínio qualquer se tornar "casável" (casável?? essa pegou pesado...)

 

 

e vou indicar um função relacionada e util:

 

http://br.php.net/manual/en/function.http-build-query.php

 

exemplo:

$query = array('pagina' => '1',
			 'secao' => 'a',
			 'tema' => 'abc',
			 'idioma' => 'portugues');

echo http_build_query($data);//pagina=1&secao=a&tema=abc&idioma=portugues

dai voce pode ate usar em junto com sua função =)

 

t+

Interessante essa função. Eu não conhecia.

Dá para separar a URL no "?" e aplicá-la à query string, mas será que é necessário? Dessa forma está funcionando bem, não está? Que vantagem haveria, visto que eu deveria tranformar a query string em um array e separar as variáveis de seu valor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

a vantagem é que as vezes voce precisa montar a query com varios campos de um formulario ou com dados vindos do banco e as vezes voce nem sabe a quantidade, dai fica uma forma dinamica e pratica, nao que nao de para fazer isso na mao, mas a função é pratica

Compartilhar este post


Link para o post
Compartilhar em outros sites

A algum tempo atrás, precisei de uma função que fizesse isto, então com a juda de um companheiro aqui do fórum desenvolvemos uma que para meus propósitos está funcionando muito bem, tanto para "http://" como para "www", aí está ela:function achaLink($txt){ $txt = str_replace("\n", "<br>", $txt); $txt = str_replace("http://", "", $txt);//retira o "http://" dos links, para ficarem iguais. $txt = eregi_replace('www\.([a-z0-9-]*)\.([a-z0-9\/\?_=.\-]*)', '<a href="http://www.\\1.\\2" target="_blank">http://www.\\1.\\2</a>', $txt); return($txt);}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tanto a do Beraldo quanto a do hcar são muito boas.

Achei a do hcar mais útil por transformar em link também os endereços que tem www(sem o http://).

Mas na função dele(hcar), se o endereço tiver um "&", quebra o link, por exemplo:

 

http://forum.imasters.com.br?id=12&usuario=89 o link ficaria so até http://forum.imasters.com.br?id=12

 

o que precisaria acrescentar na E.R. para que isso funcionasse dessa forma, não manjo muito de expressões regulares... :mellow:

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tanto a do Beraldo quanto a do hcar são muito boas.

Achei a do hcar mais útil por transformar em link também os endereços que tem www(sem o http://).

Mas na função dele(hcar), se o endereço tiver um "&", quebra o link, por exemplo:

 

http://forum.imasters.com.br?id=12&usuario=89 o link ficaria so até http://forum.imasters.com.br?id=12

 

o que precisaria acrescentar na E.R. para que isso funcionasse dessa forma, não manjo muito de expressões regulares... :mellow:

 

Até mais.

function achaLink($txt)

{

$txt = str_replace("\n", "<br>", $txt);

 

$txt = str_replace("http://",'>http://", "", $txt);//retira o "http://" dos links, para ficarem iguais.

$txt = eregi_replace('www\.([a-z0-9-]*)\.([a-z0-9\/\?_&=.\-]*)', '<a href="http://www.\\1.\\2" target="_blank">http://www.\\1.\\2</a>', $txt);

return($txt);

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito boa essa função

estava precisando dela inclusive para quebrar paragrafos

 

Porém, faltou um caso

eu inseri um link da wikipedia que continha caracteres do tipo

http://pt.wikipedia.org/wiki/A%C3%A7o

 

ele não transforma em link e retira o http:// ficando assim

 

pt.wikipedia.org/wiki/A%C3%A7o

 

Existem mtos artigos da wikipedia que utilizam acentuação e ficam desse jeito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu havia alterado meu script e esqueci de atualizar os t'opicos em que o postei... :rolleyes:

 

'E que faltou adicionar o sinal de porcentagem `a ER.

 

Troque a ER por esta:

$er = "/http:\/\/(www\.|.*?\/)?([a-zA-Z0-9]+|_|-)+(\.(([0-9a-zA-Z]|-|_|\/|\?|=|&|%)+))+/i";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe algum script que transforma o contéudo que contém acentos de um campo texto assim :notícia(cadastrado no banco de dados) > notícia(exibição)Eu teria que criar todas as condições no arquio mostrar ou daria para puxar de um arquivo/função externo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consegui aplicar essa função e não consegui adicionar a porcentagem no código do hcar, acabei desistindo.Mas vi tb que a função não funciona com endereços ww2 www2 ww3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Subindo o tópico novamente!

 

Fiz um script bem simples e pequeno mas que pode ser util, ele transforma urls, dentro de um texto, que começam com http:// ou www. em links. Até o momento testei com várias urls e tem funcionado com todas seguindo os padroes citados.

 

$texto=htmlspecialchars($_GET['texto']);

	if(preg_match('@((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@',$texto)){

			$texto=preg_replace('@((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@', '<a href="http://$1">$1</a>', $texto);

		}elseif(preg_match('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@',$texto)){

			$texto=preg_replace('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@', '<a href="$1">$1</a>', $texto);

			}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Subindo o tópico novamente!

 

Fiz um script bem simples e pequeno mas que pode ser util, ele transforma urls, dentro de um texto, que começam com http:// ou www. em links. Até o momento testei com várias urls e tem funcionado com todas seguindo os padroes citados.

 

$texto=htmlspecialchars($_GET['texto']);

	if(preg_match('@((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@',$texto)){

			$texto=preg_replace('@((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@', '<a href="http://$1">$1</a>', $texto);

		}elseif(preg_match('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@',$texto)){

			$texto=preg_replace('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@', '<a href="$1">$1</a>', $texto);

			}

Beleza o seu script, huoxito. Mas me parece que ele vai parar se encontrar "www." e não vai transformar os "hhtp://" que aparecerem depois.

 

Transformando primeiro os "www." em "http://www." funcionou melhor pra mim.

 

Modifiquei assim:

if (preg_match('@((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@', $texto)) {
	$texto = preg_replace('@((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@', 'http://$1', $texto);
}
if (preg_match('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@', $texto)) {
	$texto = preg_replace('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@', '<a href="$1" target="new">$1</a>', $texto);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eh verdade grecco, valeu, nao tinha testado em strings com mais de uma urls, bem lembrado!

 

valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido o problema com varios tipos de links numa mesma string. Após algumas mudanças na expressao regular do script:

 

Acredito que esse esteja bem melhor pois transforma qualquer url que comece com http:// ou com www. em links corretamente.

	if(preg_match('@[^(http://)]((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@i',$comment)){
			$comment=preg_replace('@[^(http://)]((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@i', ' http://$1', $comment);
		}
	if(preg_match('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@i',$comment)){
			$comment=preg_replace('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@i', '<a href="$1">$1</a>', $comment);
		}

Compartilhar este post


Link para o post
Compartilhar em outros sites

bah cara, uma coisa que ia ficar perfeito é você fazer detectar se o link termina com .jpg, .png, .gif, etc... Assim dava pra você fazer transformar em <img> =)

Se eu soubesse fazer juro que faria, alguem ajuda ai? ia ser perfeito pro meu fórum =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.