falcao544 11 Denunciar post Postado Outubro 23, 2010 Pessoal to com um problema! Queria saber o que há de errado no meu 1º If, porque eu fiz testes aqui para ver se entrava no If mas não entra e eu não sei porque! Valeu! <?php $link=$_POST["link/url"]; if(!preg_match("/(.+)\.(.+)$/i", $link)){ echo"<script>alert('URL/Link Invalido!')</script>"; echo"<script>history.go(-1)</script>"; } elseif(preg_match("/^(http:\/\/)/i", $link) && !preg_match("/(www\.)/i", $link)){ echo"a"; $conectar=curl_init(); curl_setopt($conectar, CURLOPT_URL, $link); curl_exec($conectar); $teste=curl_getinfo($conectar, CURLINFO_HTTP_CODE); if($teste==404){ echo"<script>alert('URL/Link Invalido!')</script>"; echo"<script>history.go(-1)</script>"; exit(); } curl_close($conectar); } elseif(preg_match("/(www\.)/i", $link) && !preg_match("/^(http:\/\/)/i", $link)){ echo"aa"; $link="htpp://".$link; $conectar=curl_init(); curl_setopt($conectar, CURLOPT_URL, $link); curl_exec($conectar); $teste=curl_getinfo($conectar, CURLINFO_HTTP_CODE); if($teste==404){ echo"<script>alert('URL/Link Invalido!')</script>"; echo"<script>history.go(-1)</script>"; exit(); } curl_close($conectar); } ?> Compartilhar este post Link para o post Compartilhar em outros sites
pointcreative 0 Denunciar post Postado Outubro 23, 2010 Está funcionando essa sua expressão regular? pra que vai server? gerador de link premium ou outra aplicação? fiz algo rapido para você tomar como exemplo. <? $link = ""; if (preg_match('#^http://([a-z0-9]+)\.megaupload\.com/#', $link)) { echo "megaupload"; } elseif (preg_match('#^http://([a-z0-9]+\.)?rapidshare\.(com)/#', $link)) { echo "rapidshare"; }else { echo "link invalido!"; } ?> Você postou seu codigo pela metade! e não é necessario repetir o codigo todo nos elseif, crie um função padrão para cURL ou baixe a classe dela e faça seu codigo apartir dela. vai economizar muitas linhas em seu codigo. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 23, 2010 A sua ER, do primeiro IF vai casar: - UM ou MAIS caracteres; - Seguido de um ponto (literal) - Seguindo de UM ou MAIS caractereses, de novo. Isso buscando de trás para frente, por causa do cifrão. Com qual string está testando, esperando ue caia nele? Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 23, 2010 Pointcreative não é nada disso não, mas valeu pela sugestão! A sua ER, do primeiro IF vai casar: - UM ou MAIS caracteres; - Seguido de um ponto (literal) - Seguindo de UM ou MAIS caractereses, de novo. Isso buscando de trás para frente, por causa do cifrão. Com qual string está testando, esperando ue caia nele? É isso mesmo Bruno Augusto, tem que buscar de trás para frente, a string seria qualquer URL! Provavelmente existem jeitos melhores, mas eu queria entender porque o meu não funciona! Eu coloquei um echo antes do 1º if e um dentro dele, mas so o de fora funcionou! Você sabe qual é o problema? Valeu! Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 23, 2010 Repito a pergunta: Com qual string está testando, esperando que caia nele? Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 23, 2010 Repito a pergunta: Com qual string está testando, esperando que caia nele? Como eu disse qualquer URL! No caso eu to testando com google.com, mas deveria cair com qualquer URL! Valeu! EDIT: Bruno só para avisar que os botões da barra de opções aqui na hora de escrever uma resposta não estão funcionando! Eu clico no botão da tag quote mas não vai! Valeu! Pessoal não entendam isso como flood, mas é que eu realmente to precisando de resolver esse problema! Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 23, 2010 Pessoal agora a coisa ficou feia, realizei testes mas nada! Olhem, peguei no 1º if coloquei assim: <?php if(preg_match("/(.+)\.(.+)$/i", $link)==false){ //echo"<script>alert('URL/Link Invalido!')</script>"; //echo"<script>history.go(-1)</script>"; echo"banana"; }?> O que me retorna? banana, ou seja, tá dando erro, porque no manual fala, que o preg_match retorna false quando acontece um erro! Aí eu peguei e coloquei dentro desse if a função preg_last_error: <?php if(preg_match("/(.+)\.(.+)$/i", $link)==false){ //echo"<script>alert('URL/Link Invalido!')</script>"; //echo"<script>history.go(-1)</script>"; echo"banana\n"; echo preg_last_error(); }?> E o que me retorna? 0 isso mesmo "0", que nem é um tipo de retorno dessa função! Agora eu já não sei mais o que fazer! Já coloquei <?php ini_set("display_errors", 1); error_reporting(E_ALL); ?> Mas não acusam nada! Eu tamém to usando a função ob_start(); no inicio do código porque sem ele da erro na função session_start(); Acusa esse erro: Cannot send session cache limiter Mas, creio eu, que o ob_start() não atrapalhe o preg_match! Então pessoal o que tá acontecendo? Valeu! Segue todo o código: <?php ini_set("display_errors", 1); error_reporting(E_ALL); ob_start(); if($_SERVER["REQUEST_METHOD"]=="POST"){ mysql_connect("HOST", "USER", "SENHA") or die(mysql_error()); mysql_select_db("BD") or die(mysql_error()); $link=$_POST["link/url"]; echo"maca\n"; if(preg_match("/(.+)\.(.+)$/i", $link)==false){//aqui deveria ser !preg_match("/(.+)\.(.+)$/i", $link) mas mudei para os testes //echo"<script>alert('URL/Link Invalido!')</script>"; //echo"<script>history.go(-1)</script>"; echo " banana\n"; echo preg_last_error(); preg_last_error(); } elseif(preg_match("/^(http:\/\/)/i", $link) && !preg_match("/(www\.)/i", $link)){ //echo" a"; $conectar=curl_init(); curl_setopt($conectar, CURLOPT_URL, $link); curl_exec($conectar); $teste=curl_getinfo($conectar, CURLINFO_HTTP_CODE); if($teste==404){ echo"<script>alert('URL/Link Invalido!')</script>"; echo"<script>history.go(-1)</script>"; exit(); } curl_close($conectar); } elseif(preg_match("/(www\.)/i", $link) && !preg_match("/^(http:\/\/)/i", $link)){ echo"aa"; $link="htpp://".$link; $conectar=curl_init(); curl_setopt($conectar, CURLOPT_URL, $link); curl_exec($conectar); $teste=curl_getinfo($conectar, CURLINFO_HTTP_CODE); if($teste==404){ echo"<script>alert('URL/Link Invalido!')</script>"; echo"<script>history.go(-1)</script>"; exit(); } curl_close($conectar); } //////////////////////////////////////////////////////////////////////////////// echo"g\n"; include("gerar_codigo.php"); $senha=$senha; $query=mysql_query("INSERT INTO links(codigo, link_original) VALUES('$senha', '$link')"); session_start(); $_SESSION["codigo"] = $senha; $_SESSION["link"] = $link; echo"<script>window.location.href('index3.php')</script>"; } else{ echo"<script>window.location.href('index2.html')</script>"; } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 23, 2010 Você está comparando errado if( preg_match("/(.+)\.(.+)$/i", $link) == false ) {} Colocando um terceiro parâmetro, temos o retorno dos casamentos. Para google.com, temos: array 0 => string 'google.com' (length=10) 1 => string 'google' (length=6) 2 => string 'com' (length=3) Se fizermos um var_dump() forçando o cast desse array para boolean: var_dump( (bool) $matches ); // Saída: boolean true Esse $matches seria essa terceira variável. Agora traduzindo o primeiro bloco de código, teríamos: if( TRUE == FALSE ) {}Como é óbvio, TRUE nunca será FALSE, logo é plausível o banana não ter aparecido. Tire a comparação por FALSE e verá que ele aparece. Simplificando, para que foquemos apenas no problema: if( preg_match("/(.+)\.(.+)$/i", $link ) ) { echo 'Casou no primeiro IF'; } elseif( preg_match( "/^(http:\/\/)/i", $link ) && ! preg_match("/(www\.)/i", $link ) ) { echo 'Casou no Primeiro ELESEIF'; } elseif( preg_match( "/(www\.)/i", $link ) && ! preg_match( "/^(http:\/\/)/i", $link ) ) { echo 'Casou no Segundo ELSEIF'; } - google.com retona Casou no primeiro IF Tanto http://google.com (intencionado a casar no segundo) quanto www.google.com (intencionado a casar no terceiro) continuaram retornando Casou no primeiro IF Mas por quê? O culpado é o ponto da primeira ER. Como ele permite QUALQUER caractere, um ou mais, à equerda E à direita de um ponto, vai sempre cair na primeira. Eu acho melhor você fazer o seguinte, é mais indolor. - Receba a URL - Verifique se nela há o http://. Se não tiver, adicione você mesmo. - Verifique se nela há o www.. Se não tiver, verifique se tem qualquer coisa, seguida do domínio e o TLD. Se tiver esse qualquer coisa, é um subdomínio e adicionar um www. pode tornar o link inválido em alguns sites com servidores mal-configurados. Se não tiver o www. e também não for um subdomínio, adicione manualmente o termo. Até aqui você NÃO VAI precisar de ER's. Apenas com uso de strpos() e substr_replace() é possível. Depois disso tudo, valide a URL. E então só neste ponto use uma ER tão específico quanto a possibilidade de se validar uma URL. Ou se você não se achar ser o super-mega-ninja das ER's, use filter_var(), usando a flag FILTER_VALIDATE_URL Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 23, 2010 Como é óbvio, TRUE nunca será FALSE, logo é plausível o banana não ter aparecido. Pelo contrário, o banana aparece! Colocando um terceiro parâmetro, temos o retorno dos casamentos. Para google.com, temos: Que terceiro parâmetro é esse? E Bruno Augusto eu gostaria de usar RegEx em tudo! Porque to aprendendo agora, então gostaria de fazer isso só com RegEx! Vou fazer o que você disse, mas utilizando RegEx! Valeu! Vou usar por enquanto esse filter_var() mas depois vou criar uma RegEx para validar URL's! - Verifique se nela há o www. Não precisa basta o http://google.com! Mesmo assim valeu! Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 23, 2010 Como é óbvio, TRUE nunca será FALSE, logo é plausível o banana não ter aparecido. Pelo contrário, o banana aparece! Certeza? Testei de novo aqui só pra confirmar no caso de eu ter escrito bobagem. E, de fato, NÃO aparece: if( preg_match("/(.+)\.(.+)$/i", 'google.com') == false ) {echo 'banana';} Colocando um terceiro parâmetro, temos o retorno dos casamentos. Para google.com, temos: Que terceiro parâmetro é esse? Veja no manual, sobre preg_match(). Informando uma variável qualquer, de preferência ainda não criada para que nada anteriormente em usado seja sobrescrito, tudo aquilo que na ER você colocar entre parênteses será capturado e armazenado em tantos índices quantos grupos existam na ER, a partir do segundo índice, já que o primeiro conterá todo o trecho casado. E Bruno Augusto eu gostaria de usar RegEx em tudo! Porque to aprendendo agora, então gostaria de fazer isso só com RegEx! Vou fazer o que você disse, mas utilizando RegEx! Valeu! Isso é muito bom. Sinal de que você está disposto a aprender mais sobre o assunto. Mas ao mesmo tempo que você tem de saber muito sobre a programação em si, também deve pensar na performance do sistema no geral. Cada milisegundo que você puder popuar, num todo, salvará os usuários de engasgos constrangedores. Mas cada um com sua opinião, e eu respeito a sua. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif - Verifique se nela há o www. Não precisa basta o http://google.com! Mesmo assim valeu! Isso foi apenas para justificar a busca por www. nas suas ER's ;) Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 23, 2010 Bruno testa aqui: http://linkisite.us/validar.php Você vai ver que aparece banana e maca! E cara refiz o código com RegEx e com strpo mas tá dando a mesma coisa sempre! Ele entra mas não sai do primeiro if! Testei de duas maneiras: <?php if(strpos($link, "http://") === false){ $link = "http://".$link; exit(); } ?> E: <?php if(!preg_match("/^(http:\/\/)/i", $link)){ $link = "http://".$link; exit(); } ?> Mas não funcionaram! Sempre entrando no primeiro if e não saindo dele! Eu to sempre usando google.com para os testes! EDIT: Bruno lá embaixo, mostram os usuários online e os visitantes certo? Então eu acabei de ver na página inicial do fórum, escrito lá embaixo alexa, yahoo, google e Ask Jeeves! São os webcrawlers deles? Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 24, 2010 Esse dois últimos códigos são dois IF's. Quais são os ELESIF's correspondentes que tentou? O maior problema está em combinar a primeira ER com as outras, a fim de haver possibilidade se entrar nas outras condições. Eu testei esse dois aqui. Com google.com a saída é o http:// adicionado. Com esse prefixo, nada é alterado porque já está certo. Os mesmos resultados tanto com preg_match() quanto com strpos(). P.S.: O link que você passou não tem nada! Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 24, 2010 Desculpe Bruno! http://linkisite.us/index2.html é esse na verdade! O validar.php é o que eu uso para validar os dados XD Isso da saída do htpp:// adicionado eu sei! Eu retirei os ELSEIF's e coloquei o exit(); no lugar! Aí depois desse if coloquei um if com o filter_var assim: <?php if(!filter_var($link, FILTER_VALIDATE_URL)){ .... ?> Aí depois desses dois IF's eu coloquei o cURL para ver o tipo de resposta da conexão(404, 406, 200, etc). Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 24, 2010 Eu retirei os ELSEIF's e coloquei o exit(); no lugar! Aí depois desse if coloquei um if com o filter_var assimAgora que vi seu exit(); Um exit aborta toda a operação que existe abaixo dele, independente se ele está dentro de algum bloco de código: if(!preg_match("/^(http:\/\/)/i", $link)){ $link = "http-~~-//".$link; exit(); } echo $link; Se nesse código, $link valer qualquer coisa que não inicie com http:// vai entrar no IF e, pelo fato de existir aquele exit, o echo nunca acontecerá. Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 25, 2010 Não sabia disso Bruno! Valeu! Vou testar amanha e posto o resultado! Mas o estranho é que quando faço um sistema de cadastro sempre uso exit(); e funciona! Mas vou dar uma estudada nisso! Mais uma vez valeu! Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 25, 2010 Fora depuração, as únicas vezes que uso exit são após ecoar um XML para uso com AJAX ou após enviar uma mensagem após ter enviado algum HTTP Header específico (404 de Não encontrado, 405 de Método não permitido...). Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 25, 2010 E nas outras horas elseif e else né? Assim que eu puder eu testo um novo código! Fui no php.net e olhei sobre o exit();! Vi que quando ele é usado o script para mas o estranho é que uso exit(); nos meus IF's quando eu faço meus sistemas de cadastro e funciona, mas vou revisar meus códigos e ver o porque! Valeu Bruno! Bruno Augusto muito obrigado pela antenção e a ajuda! Muito obrigado mesmo! Agora acho que aprendi a forma correta de usar o exit();! Nos meus sistemas de cadastro ele funcionava porque se entrasse no IF mudava de página exemplo: <?php $usuario = "Bruno"; if($usuario == "Bruno"){ echo"<script>alert('Usuario invalido!')</script>"; echo"<script>history.go(-1)</script>"; exit();//Tenho que colocar esse exit para que pare a execução e volte à página anterior! }?> Mas só uma coisa! Esse exit aí em cima funciona? Porque eu acho que ele funciona mas também acho que não, pois penso que o redirecionamento acontece antes! Valeu! Cara agora é guerra o código não anda!!! Não quer funcionar! O estranho é que ponho alguns echos para ver até onde o código entra, e tem uma parte que dei um echo"a"; e ele imprimiu o echo"a"; mas o que tava logo antes dele dentro do if que contém esse a e esses outros echos não funcionaram! Na boa eu sei que não sou um ótimo programador, mas também não sou um iniciante, eu acho que eu estou já em um nível em que eu possa afirmar que alguma coisa tá atrapalhando o modo como o script roda! Afirmo isso poruqe já realizei inúmeros testes e obtive resultados absurdos, retornos inexistentes de alguams funções! Vou testar em outro servidor e ver se roda! valeu! Fiz testes em outro servidor! E o que me retorna? No primeiro teste deu erro 302 no segundo 301! Coisa de doido! Já sei o que vou fazer! Vou criar outro código <_< mas sem cURL depois implemento! Bom Bruno agora foi! Usei só o filter_var! Um dos problemas(não sei porque) era que não estava se redirecionando com o window.location.href('pag'), mas agora com o <meta http-equiv='refresh' content='0;url=PAG'>, está funcionando bem! Muito obrigado Bruno mais uma vez! Bruno sem querer abusar, você recomenda esse livro? http://www.submarino.com.br/produto/1/196124/php+e+mysql:+desenvolvimento+web Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 25, 2010 Caramba, você postou várias vezes seguidas não foi? Cara, a mesclagem automática deixou o contexto estranho. :lol: Sobre a questão do exit após um JS, não sei dizer. Nunca fiz isso. Sempre que precisava desse history.go, atribuia ele à um link. Acho que fica mais elegante uma mensagem a qual você pode estilizar com o próprio CSS da página do que um alert num fundo branco que te arranca de volta pra você estava. Quanto aso códigos de erro, na verdade não são erros. HTTP 301 significa que aquilo que foi requisitado foi movido permanentemente. HTTP 302 significa que aquilo que foi requisitado foi encontrado. Agora saber o porquê de você ter recebido, só estudando direitinho o seu caso, seu script, as configurações do servidor... Enfim, uma "trabalhêra" só. :P Por fim, quanto ao livro esse eu desconheço. Eu aprendi o básico com a Bíblia do PHP, depois li o PHP pra quem conhece PHP, do Juliano Niderauer. Daí pra frente só em Fóruns, e-books, slideshows e etc. Compartilhar este post Link para o post Compartilhar em outros sites
falcao544 11 Denunciar post Postado Outubro 25, 2010 É XD eu esqueci de colocar os EDIT's! Em relação a intergrar o history.go em um link e estilizar com CSS não vai acontecer comigo porque ainda não aprendi CSS! Mas é uma boa ideia! Mas a questão é que gosto daquela caixa do alert! Aliás seria possível estilizar ela? Ou criar algo parecido usando JS e CSS? Tipo uma janela modal sei lá, mas com o mesmo efeito? Me desculpe me referi de forma errada aos códigos de status! É mesmo vai dar trabalho, mas vou esquecer esse código já implementei um novo como eu disse e funcionou, agora vou incrementando ele aos poucos, vou implementar cURL e etc... Bom, vou procurar sobre a bíblia! Muito obrigado Bruno, mais uma vez a equipe do iMasters se mostra competente, parabéns pelo ótimo trabalho! Compartilhar este post Link para o post Compartilhar em outros sites