Ir para conteúdo

POWERED BY:

Arquivado

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

Luiz Otávio Foreba

[Resolvido] Como pegar o valor do ereg_replace (apenas o que foi

Recommended Posts

Pessoal, já quebrei a cabeça aqui mas nao dei conta de resolver... tenho um site de relacionamentos que fica dentro de outro site, meu site faz tres serviços, encurtador de urls grátis, site de tecnologia, e tem uma parte de relacionamentos...

 

Eu gostaria que todas as urls enviadas pelo pessal do site de relacionamento, fosse trocadas pelas url encurtadas do site... eu ja tenho o sistema prontinho, só preciso agora conseguir pegar o valor da url e transformar em variavel...

 

se ajudar, eu transformmo url assim:

 

$post_user = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
"<a href=\"\\0\">link</a>", $post_user);

Então todas as urls ficam aparecendo com o texto LINK... isso ta certo... agora gostaria de trocar o "LINK" e a url pelo meu encurtador...

 

fiz tudo certo, mas não consigo pegar apenas o valor do ereg_replace, sei eu faço isso, vem o valor total com texto e tudo mais... alguém tem alguma dica para pegar só a url do ereg...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, primeiro não use ereg_replace(), substitua por preg_replace() e garanta que seu script funcione mesmo que a primeira função, que est´=a caindo em desuso, seja descontinuada.

 

Segundo, como que é a URL do seu encurtador? Precisamos saber como ela é para que uma ER construída não dê problemas.

 

Terceiro, do jeito que está, você pode otimizar sua ER:

 

- Você não precisa das classes POSIX. Veja as substituições correspondentes e barra-letra para os usados no Guia ER

- Seu primeiro [[:alpha:]] pode ser substituído por grupos que condicionem exatamente o protocolo da URL que você aceitará: http/https, ftp...

- Use aspas simples para que sua ER fique "crua" e você poderá dispensar tantos escapes ( \ ).

- Ao usar preg_replace() você rpecisará de delimitadores em volta da ER. Para URL's é recomendável não usar barras ( / ), reforçando a dimnuição de escapes.

 

No mais, por enquanto, é isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, primeiro não use ereg_replace(), substitua por preg_replace() e garanta que seu script funcione mesmo que a primeira função, que est´=a caindo em desuso, seja descontinuada.

 

Segundo, como que é a URL do seu encurtador? Precisamos saber como ela é para que uma ER construída não dê problemas.

 

Terceiro, do jeito que está, você pode otimizar sua ER:

 

- Você não precisa das classes POSIX. Veja as substituições correspondentes e barra-letra para os usados no Guia ER

- Seu primeiro [[:alpha:]] pode ser substituído por grupos que condicionem exatamente o protocolo da URL que você aceitará: http/https, ftp...

- Use aspas simples para que sua ER fique "crua" e você poderá dispensar tantos escapes ( \ ).

- Ao usar preg_replace() você rpecisará de delimitadores em volta da ER. Para URL's é recomendável não usar barras ( / ), reforçando a dimnuição de escapes.

 

No mais, por enquanto, é isso.

 

Você pode mostrar um exemplo no código que mandei??

 

O encurtador de url funciona de modo muito simples...

 

pega a URL original, salva no banco de dados, depois encurta a url...

 

da uma analisada nele aqui ó: link do encurtador

 

Já o site de relacionamento, se quiser analisar tb.. segue o link http://phiper.com/

 

Eu tinha pensado em fazer alguma coisa do tipo "se pegar a url" insere na tabela do encurtador e retorna o valor, ou seja, a url curta.. mais eu tenho que conseguir pegar o valor (a url) do ereg_replace (ou preg_replace).

 

Só que, como eu disse, tudo que o usuário escreve, vem junto no valor retornado do ereg_replace...

 

Então, se o cara digita, por exemplo:

 

"Olha este link http://phiper.com"

 

isto irá se transformar em:

 

"Olha este <a href="http://phiper.com">Link</a>"

 

Só que o problema que o valor que retorna não posso inserir na tabela do encurtador, por que preciso apenas do link que o cara mandou, e não do texto..

 

Então de "Olha este link http://phiper.com" eu queria pegar apenas http://phiper.com.

 

Asssim eu enviaria para a tabela do encurtador, e logo buscava pela url curta correspondente...

 

para fica mais simples, é como o Twitter, entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu entendi direito, primeiro você vai converter, depois listar todas as URL's convertidas e, por fim, gravar no banco sob o qual o encurtador trabalha.

 

Vamos ver...

 

function convertLinks( $str ) {
   return preg_replace( '/[[:alpha:]]+:\/\/[^<>[:space:]]+[[:alnum:]\/]/', '<a href="\\0">link</a>', $str ); 
}

function getUrls( $str ) {

   preg_match_all( '/<a href="(.*?)">link<\/a>/', $str, $matches );

   return ( isset( $matches[ 1 ] ) ? $matches[ 1 ] : array() );
}

$post_user = 'Site de busca: http-~~-//www.google.com.br.<br />Site de perguntas e respostas: http-~~-//www.stackoverflow.com';

$post_user = convertLinks( $post_user );

print '<pre>'; print_r( getUrls( $post_user ) );

Resultado:

 

Array
(
    [0] => http://www.google.com.br
    [1] => http://www.stackoverflow.com
)
Seria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso mesmo... tipo o twitter mesmo... só que não retorna todas urls, apenas a que o cara mandou... o código está assim ó:

 

while ($linha = mysql_fetch_assoc($_pagi_result)) {
$id = $linha['id'];
$data = $linha['data'];
$login = $linha['login'];
$nome = $linha['nome'];
$avatar = $linha['avatar'];
$post_user = $linha['bagunca'];
				
$post_user = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
"<a href=\"\\0\" target='_blank'>link</a>", $post_user);

// AQUI EU FARIA ALGO DO TIPO

$query_inclu = "INSERT INTO tabela_do_encurtador SET url='O QUE VEM DO EREG_REPLACE'";
$exe_inclu = mysql_query($query_inclu);

// AQUI FARIA UM SELECT NA TABELA DO ENCURTADOR

// AQUI VIRIA OS ECHO'S
}

Não sei se ta certo, mas tinha pensado nisso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você viu a segunda função (e seu uso)?

 

Depois que voocê converte, ela lista todos os links de todas as âncoras do texto enviado.

 

Vai ser retornado um array, logo, para ovcê inserir link por link, precisará de outro loop:

 

$links = getUrls( $post_user );

foreach( $links as $link ) {

   $query_inclu = 'INSERT INTO tabela_do_encurtador VALUES("x", "y", "z", $link );';
   $exe_inclu = mysql_query($query_inclu);
}

O x, y, z são outros campos que possam haver nessa tabela.

 

Essa é uma das possibilidades porque o melhor seria você montar uma única query, delimitada pelos pont-e-vírgula para executar um único mysql_query(), fora do loop.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara desculpa a demora pra responder.. vou testar agora aqui e ja escrevo que qui deu aqui... abraço!

 

Cara.. to fazendo aqui.. mas fala que não pode declarar novamente convertLinks, mas eu nao tenho nada declarado com esse nomee... não entendi agora...

Compartilhar este post


Link para o post
Compartilhar em outros sites

mostra o código completo, e toma cuidado para não ter colocado a declaração da função dentro de um loop.

 

apenas voltando ao inicio:

$post_user = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
"<a href=\"\\0\">link</a>", $post_user);
a variavel que você passa como parâmetro ali,já é oque o usuário, enviou, correto ?

 

logo, se você parar de sobrescrever essa variável:

$link_final = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
"<a href=\"\\0\">link</a>", $post_user);
echo 'O link final ficou: '.$link_final.'<br  />';
echo 'Sendo que o usuário enviou: '.$post_user;
ne:! :lol:

 

você já começou tendo oque queria, não é necessário complicar nada, apenas pegar oque já tinha, e fazer oque precisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato. No exemplo eu apenas coloquei o código na função por questões de reusabilidade. Mas se você só vai usar nessa parte, pode copiar o código dela e atribuir à uma variável dentro do loop como o William postou.

 

O mesmo vale para a segunda função. Se você só vai precisar aí, atribua à uma variável e você terá um array de todo o jeito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, testei aqui como disseram, mas o problema é que não retorna apenas o Linkk.... se eu coloco dentro do loop, ele faz a função certinho.. só que retorna o que o cara digitou também, e eu preciso apenas do LINK entende??

 

Tipo, se o cara digita:

 

Oi gente eu estou escrevendo no iMaster, olha o link http://forum.imasters.com.br/index.php?/topic/399279-como-pegar-o-valor-do-ereg-replace-apenas-o-que-foi-modificado/page__gopid__1563754entry1563754

Do modo que foi descrito aí, fica assim:

 

Oi gente eu estou escrevendo no iMaster, olha o <a href='link http://forum.imasters.com.br/index.php?/topic/399279-como-pegar-o-valor-do-ereg-replace-apenas-o-que-foi-modificado/page__gopid__1563754entry1563754'>link</a>

Aí não funciona, teria que retornar apenas isso:

 

link http://forum.imasters.com.br/index.php?/topic/399279-como-pegar-o-valor-do-ereg-replace-apenas-o-que-foi-modificado/page__gopid__1563754entry1563754

 

Não sei se estou explicando bem, mas se precisar escrevo o código total aqui...

 

Outro teste

 

Agora fiz um teste colocando a função fora do loop, mas aí não ppega nada... retorna um monte de array vazio...

 

onde eu coloca nesse codigo?

 

while ($linha = mysql_fetch_assoc($_pagi_result)) {
$id = $linha['id'];
$data = $linha['data'];
$login = $linha['login'];
$nome = $linha['nome'];
$avatar = $linha['avatar'];
$post_user = $linha['bagunca'];
                                
$post_user = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
"<a href=\"\\0\" target='_blank'>link</a>", $post_user);

// AQUI EU FARIA ALGO DO TIPO

$query_inclu = "INSERT INTO tabela_do_encurtador SET url='O QUE VEM DO EREG_REPLACE'";
$exe_inclu = mysql_query($query_inclu);

// AQUI FARIA UM SELECT NA TABELA DO ENCURTADOR

// AQUI VIRIA OS ECHO'S
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que o Imaggens já postou isso, mas lá vai:

 

<?php

$string = <<<STRING
Oi gente eu estou escrevendo no iMasters, olha o <a href='http-~~-//forum.imasters.com.br/index.php?/topic/399279-como-pegar-o-valor-do-ereg-replace-apenas-o-que-foi-modificado/page__gopid__1563754entry1563754'>link</a>.
Apelei pra lá porque também procurei no <a href="http-~~-//google.com">Google</a> e não encontrei nada!!
STRING;

preg_match_all('{<a href=(\'|")(.*?)\1}', $string, $matches);

print_r($matches[2]);

 

Array
(
    [0] => http://forum.imasters.com.br/index.php?/topic/399279-como-pegar-o-valor-do-ereg-replace-apenas-o-que-foi-modificado/page__gopid__1563754entry1563754
    [1] => http://google.com
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo.. agora sim fico certo... mas e como eu vou fazer para separar os valores e inserir na tabela do encurtador?

 

Ficou assim ó

 

while ($linha = mysql_fetch_assoc($_pagi_result)) {
$id = $linha['id'];
$data = $linha['data'];
$login = $linha['login'];
$nome = $linha['nome'];
$avatar = $linha['avatar'];
$post_user = $linha['bagunca'];
                                
$post_user = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
"<a href=\"\\0\" target='_blank'>link</a>", $post_user);

$post_user = nl2br($post_user);

preg_match_all('{<a href=(\'|")(.*?)\1}', $post_user, $matches);
				
print_r($matches[2]);
// AQUI EU FARIA ALGO DO TIPO

$query_inclu = "INSERT INTO tabela_do_encurtador SET url='O QUE VEM DO EREG_REPLACE'";
$exe_inclu = mysql_query($query_inclu);

// AQUI FARIA UM SELECT NA TABELA DO ENCURTADOR

// AQUI VIRIA OS ECHO'S
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

print_r($matches[2]);
// AQUI EU FARIA ALGO DO TIPO

 

foreach($matches[2] as $link) funcao_que_encurta_as_urls($link);

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.