Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
#############################################
/*
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;
}
?>$a = "O link [http://www.Trova.Di.danu](http://www.Trova.Di.danu) é Metal! [http://www.Tuatha.de.danann](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](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](http://www.MetropolisPt2.Scenes.from.a.memory/regression/Overture1928) também parece ótimo";
echo "<p>" . MontarLink ($c) . "</p>\r\n";
Abraçossó 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?
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
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', $txt); return($txt);}
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.
>
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', $txt);
return($txt);
}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.
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";
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 ?
Use a função htmlentities(). ;)
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
Dei uma melhorada na função. Agora funciona com http e https, além de permitir www2, ww3 etc, como citado anteriormente.
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',](http://%241) $texto);
}elseif(preg_match('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@',$texto)){
$texto=preg_replace('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@', '<a href="$1">$1</a>', $texto);
}>
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',](http://%241) $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);
} $texto = preg_replace('@((http://)[a-zA-Z0-9./?&_\-#=;%]+)@', '<a href="$1" target="new">$1</a>', $texto);
}Eh verdade grecco, valeu, nao tinha testado em strings com mais de uma urls, bem lembrado!
valeu!
greco ainda há um problema no script. quando há na string um link do tipo: http://www.algumacoisa ele retorna uma url do tipo; http://http://www.algumacoisa
Preciso fazer uma expressao regular que trate urls como http://www. de uma outra forma.
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://)[a-zA-Z0-9./?&_\-#=;%]+)@i',$comment)){
$comment=preg_replace('@[^(http://)]((www\.)[a-zA-Z0-9./?&_\-#=;%]+)@i', ' [http://$1',](http://%241) $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);
}Valeu, huoxito. Agora tá perfeito!
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 =)
>
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 =)
e so verificar extensao, como muitos fazem em sistemas de upload. Voce usa explode() com ponto (".") como separador. Depois usa end() para pegar a ultima chave. Se for extensao de imagem, insira a tag img.
não dá pra fazer tipo assim?
if(preg_match('@((http://)a-zA-Z0-9./?&_\-#=;%+)@i',$comment)){
$comment=preg_replace('@((http://)[a-zA-Z0-9./?&_\-#=;%](.png)+)@i', '<img src="$1">', $comment);
}o ultimo script que postei ainda tinha um problema, como eu tava usando uma classe no primeiro if como [^(http://)], ele só reconhecia www.site.com como link se tivesse algum texto ou pelo menos um espaço antes. Achei esse script na internet que eh mais simples, menor, bem mais interessante e nao tem esses problemas, pelo menos até agora nao vi achei nenhum nos testes:
$comment = preg_replace("/((www\.|(http|https|ftp|news|file)+\:\/\/)[_.a-z0-9-]+\.[a-z0-9\/_:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])/", '<a href="$1">$1</a>', $comment);
$comment = str_replace('href="www', 'href="[http://www',](http://www) $comment);
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+