Giihh 6 Denunciar post Postado Agosto 3, 2015 Bom dia, Sei pouco sobre expressões regulares, e preciso entender melhor em outras situações, os videos que vi são mais para validações de campos em forms. Acontece que o sistema que estou montando precisa capturar pequenos conteúdos de outros sites, nisso a expressão regular deve limitar onde será cortado o conteúdo, dois exemplos que encontrei que vão em algum lugar do conteúdo são os exemplos abaixo, mas não sei interpretar. '/ORES-->(.+)<!--/s' desse código: preg_match_all('/ORES-->(.+)<!--/s', $url, $conteudo); './/meta[@name=keywords]' desse código: echo utf8_decode( $DOMXPath->query( './/meta[@name=keywords]' )->item( 0 )->getAttribute( 'content' ) ); Gostaria de ajuda para interpretar essas expressões pra quem sabe já conseguir criar minhas próprias ERs, ou alguma dica de como criar uma expressão regular que delimita de um ponto a outro, para capturar apenas o conteúdo dentro dessa delimitação Agradeço ajuda Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 3, 2015 A primeira: '/ORES-->(.+)<!--/s' Pesquisa por "ORES-->", seguido de qualquer caractere um ou mais vezes, até encontrar "<!--". O segundo não é uma ER. É um Xpath. O melhor guia sobre ERs: http://aurelio.net/regex/guia/ Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 3, 2015 A primeira: '/ORES-->(.+)<!--/s' Pesquisa por "ORES-->", seguido de qualquer caractere um ou mais vezes, até encontrar "<!--". O segundo não é uma ER. É um Xpath. O melhor guia sobre ERs: http://aurelio.net/regex/guia/ Obrigada Beraldo, Consegui alguma coisa preg_match_all('@<table class="infobox"(.+)</table>@si', $conteudo, $resultado); Mas começa capturando a partir da <table class="infobox" e depois exibe todo conteúdo das demais tables. Como faço para ele parar no primeiro fechamento da tag table que encontrar? Tem como? Qual a diferença entre o delimitador @ e o / ???? 's' acredito que é pra aceitar espaços mas 'si' é o que? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 3, 2015 preg_match_all('@<table class="infobox"(.+)</table>@si', $conteudo, $resultado); Mas começa capturando a partir da <table class="infobox" e depois exibe todo conteúdo das demais tables. Como faço para ele parar no primeiro fechamento da tag table que encontrar? Tem como? preg_match() vai parar no primeiro match preg_match_all() verifica todos os matches então no seu caso basta usar preg_match em vez de preg_match_all Qual a diferença entre o delimitador @ e o / ???? Até onde sei, nenhuma. se usar "/" como delimitador, terá de escapar as barras na ER, usando "\/" em vez de "/", por exemplo 's' acredito que é pra aceitar espaços mas 'si' é o que? Existem diversos modificadores. Você pode usar vários. "si" é a combinação do "s" e do "i". Há vários outros. Veja: http://php.net/manual/pt_BR/reference.pcre.pattern.modifiers.php Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 3, 2015 Vou usar o delimitador @ mesmo, mas tentei com \/ e não funcionou. sobre o preg_match, quando uso ele, não imprime o conteúdo somente o caracter menor "<" preg_match('@<table class="infobox"(.+)</table>@si', $conteudo, $resultado); Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 3, 2015 Vou usar o delimitador @ mesmo, mas tentei com \/ e não funcionou. Apenas use "\/" quando o delimitador for a barra ("/") Dessa forma a barra é entendida como literal, não um delimitados. Ex: "/<table>(.+?)<\/table>/i" sobre o preg_match, quando uso ele, não imprime o conteúdo somente o caracter menor "<" preg_match('@<table class="infobox"(.+)</table>@si', $conteudo, $resultado); Como está exibindo o resultado? Para ver os matches, dê um print_r em $resultado Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 3, 2015 então coloquei \/ no / do fechamento da tag </table> e sumiu o "<" dei um print com var_dump e retornou NULL print_r não esta imprimindo nada, nem mesmo NULL Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 3, 2015 preg_match e preg_match_all retornam a quantidade de matches. Para ver a lista com os matches, use o terceiro parâmetro ($resultado, no seu caso). Ele sempre será um array, mesmo que vazio. Então print_r sempre terá de mostrar algo, mesmo que seja apenas "Array()" (quando não há match algum) Veja mais aqui: http://php.net/preg_match http://php.net/preg_match_all Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 3, 2015 Ah eu tava colocando o print_r depois da linha $resultado = $resultado[0][0] comentei a linha. Então com print_r para preg_match_all esta retornando Array([0] => Array([0] => aqui todo o conteúdo com todas as tables ) ) para somente preg_match: Array([0] => exibe todo conteúdo a partir da tabela que quero e todas as outras tabelas([1] => exibe todo conteúdo a partir da tabela que quero, mas sem a parte <table class="infobox", então a tabela fica desconfigurada e exibe todas as outras tabelas também ) ) Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 3, 2015 No Guia de ERs, há a seção sobre Quantificadores Gulosos. Veja que você usou ".+" e colocou caracteres após isso. O "+" é guloso e vai fazer matches até o fim da string. Use ".+?" para evitar que ele seja guloso. Deve ser esse o problema Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 3, 2015 rsrsrs muito guloso, era isso mesmo. Obrigada Beraldo até aqui Funcionou!!! Mas, erro meu novamente, o conteúdo esta imprimindo somente metade da tabela, fui dar uma olhada dentro do html outra vez e vi que existe uma pequena tabela dentro de um <tr><td> onde ficam duas figuras pequenas :S Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 3, 2015 Outras tabelas possuem logo após a tag </table> uma <div> e percebi que depois da tabela que que quero imprimir é a unica que a próxima tag é um <p>, mas acontece que essa tag tem alguns espaçamentos e aparentemente um enter, pois esta na outra linha, então copiando como esta não funciona pensei em algo assim: \S Coincide qualquer caracter que não seja de espaço em branco. @<table class="infobox"(.+)<\/table>\S<p>@si sei que esta errado, mas a ideia seria ignorar os espaços em branco e considerar imediatamente o <p> Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 3, 2015 Se são vários espaços, você deve usar um quantificador ao lado do \S, como \S* ou \S+ Compartilhar este post Link para o post Compartilhar em outros sites
Giihh 6 Denunciar post Postado Agosto 3, 2015 Feliz!!! :D consegui usei o ponto (.) . Coincide qualquer caracter. @<table class="infobox"(.+?)<\/table>.<p>@si Muito Obrigada Beraldo ah! para consulta usei também: http://intentor.com.br/pequeno-guia-regex/ Compartilhar este post Link para o post Compartilhar em outros sites