Beraldo 864 Denunciar post Postado Fevereiro 8, 2007 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
Fabyo 66 Denunciar post Postado Fevereiro 8, 2007 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
Beraldo 864 Denunciar post Postado Fevereiro 8, 2007 só pra constar sua função nao ta funcionando com links do localhostBoa 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
Fabyo 66 Denunciar post Postado Fevereiro 9, 2007 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
Hamilcar 1 Denunciar post Postado Fevereiro 10, 2007 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
muchacho 0 Denunciar post Postado Abril 23, 2007 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
Hamilcar 1 Denunciar post Postado Maio 4, 2007 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
nknk 3 Denunciar post Postado Junho 21, 2007 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
Beraldo 864 Denunciar post Postado Junho 22, 2007 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
nknk 3 Denunciar post Postado Junho 23, 2007 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
Beraldo 864 Denunciar post Postado Junho 23, 2007 Use a função htmlentities(). ;) http://www.php.net/htmlentities Compartilhar este post Link para o post Compartilhar em outros sites
nknk 3 Denunciar post Postado Junho 24, 2007 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
Beraldo 864 Denunciar post Postado Junho 26, 2007 Dei uma melhorada na função. Agora funciona com http e https, além de permitir www2, ww3 etc, como citado anteriormente. Compartilhar este post Link para o post Compartilhar em outros sites
huoxito 0 Denunciar post Postado Outubro 11, 2009 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
grecco 0 Denunciar post Postado Outubro 13, 2009 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
huoxito 0 Denunciar post Postado Outubro 13, 2009 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
huoxito 0 Denunciar post Postado Outubro 13, 2009 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. Compartilhar este post Link para o post Compartilhar em outros sites
huoxito 0 Denunciar post Postado Outubro 14, 2009 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
grecco 0 Denunciar post Postado Outubro 14, 2009 Valeu, huoxito. Agora tá perfeito! Compartilhar este post Link para o post Compartilhar em outros sites
jrotta 0 Denunciar post Postado Outubro 14, 2009 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