Ir para conteúdo

POWERED BY:

Arquivado

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

a1click_mac

[Resolvido] Super verificação string [ PHP ] Textarea

Recommended Posts

# Galera, novamente aqui!

 

* 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 */

 

 

# Alguém poderia me ajudar nisso, estou a 3 dias quebrando a cabeça e nenhuma solcução :wacko:

 

Aguardo!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

 

# Consegui fazer a 1ª Parte aqui... ( separar os links de todo o texto ) porém ainda não sei como...

 

> 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

[1] => http://www.noticias.com/noticia.php?noticia=123

[2] => http://www.iphone7.com

[3] => mailto:contato@site.com.br

)

 

 

# Me da essa força ai alguém para fazer esses outros itens?

 

AGUARDO GALERA!!! :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 #

 

 



## PARTE 1

$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>';
print_r($contador[1]); // mostra array todo link


// 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

 

 

# Agora... como substituo esses meus novos links ( pelos antigos ) na variável ( $texto ) e determino um ( $novo_texto ) com as novas informações, Bruno ?

 

 

Aguardo man...

 

Valeu pela força que ta dando mesmo!

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!!!

 

- Tentei de tudo aqui quebrei a cabeça e nada man...

 

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

# Porém eu preciso agora é de uma [ 3ª parte ], que seria modificar os links [ atuais ] dentro da variável ( $TEXTO ) e salvar esse ( $NOVO_TEXTO ) com os links alterados que eu modifiquei.

 

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente com array_walk, em vez do foreach:

array_walk(
$contador[1],
function(&value){
sprintf('NOVO-LINK=%s', $value);
}
);

print_r($contador[1]);

Compartilhar este post


Link para o post
Compartilhar em outros sites

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ó?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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ê.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

[ 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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]);

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.