Ir para conteúdo

POWERED BY:

Arquivado

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

Giihh

Expressões regulares

Recommended Posts

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




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

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.