Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
* Possuo um seguinte problema onde não consigo achar um modo de fazer o mesmo...
1º = Tenho um <form> normal, onde o mesmo possui um ( TEXTAREA )
3º = Preciso que o meu código PHP, pegue todos os LINKS que eu adicionei dentro desse meu ( TEXTAREA ) e enviei...
4º = Ao pegar esses links, preciso que o mesmo me liste "Todos os links" para que eu possa depois dentro do código mesmo colocar um link de ( chamada ) para ele retornar o link que veio no ( TEXTAREA )
OBS.: Os links podem vir qualquer coisa, qualquer informação, então preciso que ele PEGUE ( QUALQUER e TODOS ) os links que estiverem dentro de um <a href=""
## EXEMPLO ##
/ Uma ideia de como seria /
$texto = $_POST['texto']; // aqui vem todo o textarea
// preciso que ele ( liste todos os links que vierem dentro de <a href=""
// aqui ele listaria...
site.com.br/pagina1
site.com.br/pagina2
site.com.br/pagina3
site.com.br/pagina4
// aqui eu precisaria que ele altere esses links para esses abaixo...
meusite.com.br/retorno.php?link=site.com.br/pagina1
meusite.com.br/retorno.php?link=site.com.br/pagina2
meusite.com.br/retorno.php?link=site.com.br/pagina3
meusite.com.br/retorno.php?link=site.com.br/pagina4
// aqui ele salva ( todo meu textarea no banco de dados já com os links alterados )
/ FIM /
Aguardo!!!
Vou dar uma olhada e ver o que consigo fazer.
Qualquer coisa posto o resultado aqui!
Se mais alguém tiver alguma dica solução para me dar essa força eu agradeço pessoal...
Ou use preg_replace:
$texto = "Google: http://google.com";
$texto = preg_replace( "/(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?/" , "<a href=\"$0\">$0</a>" , $texto );
echo $texto;>
Você vai precisar de Expressões Regulares, as quais, nesse caso, você pregaria através de preg_match_all() ou separar os links por algum delimitador com explode(), criando assim um array e, em seguida, utilizar preg_grep() que vai filtrar esse array somente às entradas que forem links.
A segunda alternativa é bom para o caso de haver texto em meio aos links. Se não for o caso, a primeira é mais eficiente.
Adicionar um link padrao para todos na frente dos links ( antivos ) ? ABAIXO EXEMPLO
OBS.: Os links padrões devem ser feitos para serem salvos no ( novo texto )
// link padrao para adicionar na frente dos ( links antigos )
meusite.com.br/retorno.php?link-de-retorno= { aqui vai o link antigo }
// esse link padrao deve ser feito em todos os links { em cada um link }
Salvar os links ( antigos ) em uma ( tabela -> links_antigos ) ?
Salvar todo o novo texto já com os links ( novos já definidos ) em uma ( tabela -> novo_texto ) ?
# PARTE 1 -> PARA SEPARAR OS LINKS #
// PARTE 1 -> separar os links do texto
$texto='
A melhor escola de Tokyo, <a href="http://www.tokyo.com">Leia mais</a>.
Continue sabendo as noticias do mundo, <a href="http://www.noticias.com/noticia.php?noticia=123">Leia noticias</a>.
Iphone 7 o mais vendido em 2016, <a href="http://www.iphone7.com">Iphone 7</a>.
Nos envie um email, <a href="mailto:contato@site.com.br">contato@site.com.br</a>.
';
$expressao='/<a [^>]*href="?([^">]+)"?>/';
preg_match_all($expressao, $texto, $contador);
echo '<pre>';
print_r($contador[1]); // mostra array todo link
echo '</pre>';
# Saída do código PARTE 1 #
Array
(
[0] => [http://www.tokyo.com](http://www.tokyo.com)
[1] => [http://www.noticias.com/noticia.php?noticia=123](http://www.noticias.com/noticia.php?noticia=123)
[2] => [http://www.iphone7.com](http://www.iphone7.com)
[3] => mailto:contato@site.com.br
)
AGUARDO GALERA!!! :thumbsup:
Você pode percorrer esse array e alterar seus valores precedendo-os com o URL desejado:
foreach( $links as $index => $link ) {
$links[ $index ] = $url . $link;
}
Essa é apenas UMA das ´diversas maneiras.
Bruno, eu não sei muuuuito de PHP, e meio que demoro para entender um poucos as coisas, mas quando entendo-as não esqueço.
-> Teria como você me mostrar um exemplo com a PARTE 1 que eu escrevi?, porque assim não fico em dúvida de onde colocar tal variável...
Obrigado.
>
Você pode percorrer esse array e alterar seus valores precedendo-os com o URL desejado:
foreach( $links as $index => $link ) {
$links[ $index ] = $url . $link;
}
Essa é apenas UMA das ´diversas maneiras.
# CONSEGUI RETORNAR NOVOS LINKS #
$texto='
A melhores escola de Tokyo, <a href="http://www.tokyo.com">Leia mais</a>.
Continue sabendo as noticias do mundo, <a href="http://www.noticias.com/noticia.php?noticia=123">Leia noticias</a>.
Iphone 7 o mais vendido em 2016, <a href="http://www.iphone7.com">Iphone 7</a>.
Nos envie um email para = <a href="mailto:contato@site.com.br">contato@site.com.br</a>.
';
$expressao='/<a [^>]*href="?([^">]+)"?>/';
preg_match_all($expressao, $texto, $contador);
echo '<pre>';// foreach
foreach( $contador[1] as $index => $link ) {
echo $novo_link [ $index ] = "http://www.NOVO.com.br/retorno.php?retorno=" . $link."<br><br>";
}
# SAÍDA FOREACH >>>
http://www.NOVO.com.br/retorno.php?retorno=http://www.tokyo.com
http://www.NOVO.com.br/retorno.php?retorno=http://www.noticias.com/noticia.php?noticia=123
http://www.NOVO.com.br/retorno.php?retorno=http://www.iphone7.com
http://www.NOVO.com.br/retorno.php?retorno=mailto:contato@site.com.br
Aguardo man...
Valeu pela força que ta dando mesmo!
:thumbsup:
Bom, agora que eu te ensinei um pouco mais do que aquilo que você realmente precisava fazer, posso te mostrar como fazer tudo de uma só vez.
Você vai usar preg_replace() que recebe uma Expressão Regular e substitui todas as ocorrências em, primariamente, um texto.
Para você "memprizar" as URL's na Expressão Regular e usar seus valores naquilo que vai substituir, você precisará de Grupos e Retrovisores
Como deu pra perceber que você não quer só a resposta pronta, tem dois links acima para que tente fazer sozinho.
Bons estudos. :thumbsup:
Valeu cara, vou estudar aqui para conseguir essa solução e posto o resultado ou dúvida que tiver!
>
Bom, agora que eu te ensinei um pouco mais do que aquilo que você realmente precisava fazer, posso te mostrar como fazer tudo de uma só vez.
Você vai usar preg_replace() que recebe uma Expressão Regular e substitui todas as ocorrências em, primariamente, um texto.
Para você "memprizar" as URL's na Expressão Regular e usar seus valores naquilo que vai substituir, você precisará de Grupos e Retrovisores
Como deu pra perceber que você não quer só a resposta pronta, tem dois links acima para que tente fazer sozinho.
Bons estudos. :thumbsup:
NÃO CONSEGUI!!!
A única que preciso é...
# trocar ( a URL ) do texto antiga pela ( URL nova ) e Salvar esse novo ( texto ) com a ( URL nova ) já add no mesmo.
Da essa força ai, porque realmente não consegui de jeito algum.
Esses códigos que eu postei ai de ( solução ) eu estou com eles aqui e funciona essas partes, só preciso disso que falei acima.
Aguardo! :thumbsup:
Posta como fez, para te apontar onde você errou.
>
Posta como fez, para te apontar onde você errou.
Cara eu nem consegui... TRAVEI, não consegui fazer nada, tentei muitas coisas aqui mas não consigo trocar os links para o ( $NOVO_TEXTO ) pois não sei como fazer...
xxxxxxxxxxxxxxx Ponto de Fusão xxxxxxxxxxxxxxx
Pessoal, tenho esse código abaixo onde ele pegar ( todos os links ) que vierem dentro de uma variável ( $TEXTO ).
Logo depois eu salvo esses links ( separados ) em uma tabela.
Entenderam? Segue código abaixo bem explicado...
# PARTE 1 #
>> Aqui ele pega todos os links vindos da variável ( $TEXTO )
// variável texto simples
$texto = '
<a href="meu_link"></a>
<a href="meu_link2"></a>
<a href="meu_link3"></a>
';
// expressão regular para pegar somente os LINKS
$expressao='/<a [^>]*href="?([^">]+)"?>/';
// tratar o mesmo...
preg_match_all($expressao, $texto, $contador);
// transformar em um array para exibir os links
echo '<pre>';
print_r($contador[1]);
echo '</pre>';
**# SAÍDA => PARTE 1 #**
>> esta é minha saida ( onde eu coquei esses links dentro da tag <a href="meu_link"></a>
Array
(
[0] => meu_link
[1] => meu_link2
[2] => meu_link3
)
# PARTE 2 #
>> Aqui eu recolho os array por um foreach e salvo os links ( atuais ) no banco
// foreach
foreach( $contador[1] as $key => $link ) {
// link atual
$link_atual = $link;
// salvar no banco links atuais
$sql = mysql_query ("INSERT INTO link (link_atual) VALUES ('$link_atual')");
}
# SAÍDA PARTE 2 #
>> Aqui a saida se eu der um ( echo ) simples dentro do foreach, seria essa...
meu_link
meu_link2
meu_link3
# PARTE 3 #
>> Aqui eu não tenho, pois não sei fazer essa última parte.
# Quero fazer o seguinte...
1º = Adicionar na frente de todos os ( links ) o nome [ NOVO_LINK= ]...
# SAÍDA 1º ~ DEMO #
NOVO_LINK=meu_link
NOVO_LINK=meu_link2
NOVO_LINK=meu_link3
2º = Salvar um [ NOVO_TEXTO ] com esse novos links que fiz, porém quero salvar apenas ( 1 TEXTO ) com todos os links alterados
# SAÍDA 2º ~ DEMO #
// saida demo* de como quero o novo texto para salvar
$novo_texto ='
<a href="NOVO_LINK=meu_link"></a>
<a href="NOVO_LINK=meu_link2"></a>
<a href="NOVO_LINK=meu_link3"></a>
';
É isso ai galera, alguém pode me ajudar por favor nessa # 3ª PARTE # ???
Agradeço e aguardo essa força! :grin:
Não duplique tópicos! Eu uni o outro tópico à este e edite a mensagem para parecer um resumo geral.
Muito provavelmente amanhã ou depois o Carlos Coelho aparece e dá a resposta pronta ( :lol: ), mas eu vou tentar te ensinar mesmo assim com um empurrãozinho:
$texto = $_POST['texto'];
$texto = preg_replace( '/(ER_QUE_LOCALIZOU_OS_LINKS)/', $suaURL . '\\1', $texto );
Note os parênteses adicionais na ER. Eles farão memorizar cada link encontrado.
Essa informação memorizada é acessada no segundo argumento usando o retrovisor \\N, sendo N um número de 1 à 9.
Ao atribuir o resultado desse preg_replace() dizemos que todos os casamentos de sucesso nesse texto serão substituídos por precedê-los com sua URL.
Man...
Quando faço assim, ele mostra o link, porém somente o ( último link ) alterado e não os anteriores, como resolver para que ele mostre para todos os LINKS também?
Segue ( 2 ) Exemplos abaixo da saida...
>> Exemplo 1 <<
# PARTE 3 #
// foreach [ exibir novos links ]
foreach( $contador[1] as $key => $link ) {
$novo_link = "NOVO_LINK=".$link;
$retorno = str_replace( $link, $novo_link, $texto );
} // end foreach
echo $retorno;
# SAÍDA 3 #
meu_link
meu_link2
NOVO_LINK=meu_link3
Esse exemplo ( 1 ) eu faço um [ echo $retorno ] **FORA** do ( foreach )
- - - -
>> Exemplo 2 <<
# PARTE 3 #
// foreach [ exibir novos links ]
foreach( $contador[1] as $key => $link ) {
$novo_link = "NOVO_LINK=".$link;
echo $retorno = str_replace( $link, $novo_link, $texto );
} // end foreach
# SAÍDA 3 #
NOVO_LINK=meu_link
meu_link2
meu_link3
meu_link
NOVO_LINK=meu_link2
meu_link3
meu_link
meu_link2
NOVO_LINK=meu_link3
Esse exemplo ( 2 ) eu faço um [ echo $retorno ] DENTRO do ( foreach )
Aguardo...
:thumbsup:
Tente com array_walk, em vez do foreach:
array_walk(
$contador[1],
function(&value){
sprintf('NOVO-LINK=%s', $value);
}
);
print_r($contador[1]);>
Tente com array_walk, em vez do foreach:
array_walk(
$contador[1],
function(&value){
sprintf('NOVO-LINK=%s', $value);
}
);
print_r($contador[1]);
A saída desse código mostrar apenas...
Array
(
[0] => meu_link1
[1] => meu_link1
[2] => meu_link1
)
Eu preciso que ele mostre o que veio completo no ( sprintf ), e que eu consiga salvar em ( 1 ) ÚNICO campo da tabela do banco, os ( 3 ) novos links alterados ( JUNTOS ) como se fossem um único ( texto ) sacas?
Se eu der um ( echo ) dentro do ( sprintf ) ele printa na tela os links ( alterados ), mas como eu salvo esses links? como ( 1 ) só?
Mas você nem tentou da forma que eu disse.
Eu dei uma volta um pouco maior porque eu tava com sono eu quis te ensinar um pouco mais sobre ER e as funções preg_* do que o necessário para o trabalho.
O que você efetivamente vai usar é preg_replace():
$texto = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque ornare, ligula nec dapibus ultrices, tortor urna fermentum enim, eu elementum justo tortor sit amet velit. Morbi quis mi leo, sit amet dignissim elit. Integer lectus mi, pharetra quis faucibus eu, pharetra sed erat. Integer sed ligula ac elit luctus egestas lobortis eget nunc. Phasellus ligula nibh, imperdiet non accumsan vel, varius et lorem. In hac habitasse platea dictumst. Etiam sit amet lectus lorem, nec congue dolor. Pellentesque lobortis, augue at ullamcorper venenatis, tellus ipsum faucibus eros, et rutrum arcu nunc et ligula. Quisque odio elit, pellentesque sit amet tincidunt id, accumsan id est. Proin ornare, ante a mattis venenatis, dolor nibh imperdiet libero, non ultrices enim elit at purus. Pellentesque auctor mollis erat. Aliquam ante dui, tempor id sagittis ut, euismod eu dolor. Praesent eu eros justo, in aliquam odio. Aliquam consectetur mauris eget est scelerisque ac consequat risus interdum.
Essa linha tem um link para o Google ( http://www.google.com )
Mauris eu augue dolor, eget adipiscing odio. Suspendisse venenatis semper sem nec convallis. Mauris convallis, leo eget suscipit rhoncus, felis mi tristique purus, ut mattis orci mauris vitae risus. Suspendisse molestie mattis quam, ut ullamcorper orci porttitor ac. Cras consectetur mollis nunc, et condimentum lacus ornare eu. Aenean ac est sem. Aliquam erat volutpat. Integer ac justo felis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In hac habitasse platea dictumst. Etiam blandit hendrerit condimentum.
E essa outra para o iMasters ( http://www.imasters.com.br )
Curabitur at velit dui. Sed suscipit massa ut orci hendrerit consequat. Nam vehicula, felis eu vulputate vehicula, turpis neque facilisis justo, ut vulputate lorem odio eu erat. Nam venenatis ipsum in felis dictum malesuada. Pellentesque tellus elit, fermentum eget ornare eu, lobortis eu purus. Phasellus semper, tortor at volutpat euismod, lectus nulla porttitor neque, a blandit dui dui id est. Maecenas adipiscing condimentum nisl a rhoncus. Maecenas et elit lorem. Sed ullamcorper dolor ultrices mauris luctus mollis eu vel quam. Etiam quis felis id nisl gravida tincidunt.';
preg_match_all( '/(http:\/\/[^ ]+)/', $texto, $matches );
var_dump( $matches );
$texto = preg_replace( '/(http:\/\/[^ ]+)/', 'http://www.site.com/retorno.php?link=?\\1', $texto );
echo nl2br( $texto );
Veja eu usei preg_match_all() só para testar a ER antes de usá-la pois casar todos os tipos e formas de um link não é nada fácil.
Esse padrão simplifica caracteriza todos os http:// seguidos de ao menos uma qualquer coisa exceto um espaço, o que é bem útil para o contexto já que não podem haver espaços num link.
Eu capturo num grupo e uso ele através do retrovisor \\1 para efetuar a substituição.
Funciona? Funciona. Mas esteja ciente de que haverão falhas de captura em links de formato inesperado pela ER, como por exemplo, links que não começam com http://
Mas montar essa ER é já é com você.
AAAAAH, agora eu entendi.
pow cara, bem simples mesmo o código, agora eu vou ler mais sobre [ER] e tentar resolver para links sem http
VALEU PELA FORÇA!!!! :clap: :clap: :clap:
[ RESOLVIDO ]
# Segue resolução abaixo #
Bruno, resolvi o problema de "não saber qual link virá" e "como o link virá"
Fiz algumas modificações no código que você me passou, fiz uma expressão regular para pegar links somente dentro de ( <a href ), onde serão os únicos links FUNCIONAIS para se levar a algum lugar quando clicar.
# código #
$texto = '
HTTP ( <a href="http://www.google.com">Google http</a> )
HTTPS ( <a href="https://www.google.com">Google https</a> )
FTP ( <a href="ftp://www.google.com">Google ftp</a> )
MAILTO ( <a href="mailto:google@google.com">Google mail</a> )
!= TUDO ( <a href="google.com">Google != tudo</a> )
';
$expressao = '/<a[^>]*?href=[\'"](.*?)[\'"][^>]*?>(.*?)<\/a>/si';
$retorno = 'http://www.site.com/retorno.php?link=';
$novo_texto = preg_replace( $expressao, '<a href="'.$retorno.'\\1">\\2</a>', $texto );
echo nl2br( $novo_texto );
Valeu pela força ai pessoal! :D
Sei que já está resolvido, mas só pra corrigir o meu erro no array_walk, o correto é:
array_walk(
$contador[1],
function(&$value){
$value = sprintf('NOVO-LINK=%s', $value);
}
);
print_r($contador[1]);
Você vai precisar de Expressões Regulares, as quais, nesse caso, você pregaria através de preg_match_all() ou separar os links por algum delimitador com explode(), criando assim um array e, em seguida, utilizar preg_grep() que vai filtrar esse array somente às entradas que forem links.
A segunda alternativa é bom para o caso de haver texto em meio aos links. Se não for o caso, a primeira é mais eficiente.