Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, pra começar minha dúvida, segue um exemplo de conteúdo que preciso formatar:
> CON BSE12074 Expresso Bradesco PF 4417810314055014 07/08/2013 07/08/2013 09/08/2013 06 13 4055014 ADT 541,00 2,70 543,70 On-line QUEBRA** <br />
0,00 <br />
<br />
<br />
<br />
<br />
**CON BSE12073 Expresso Bradesco PF 4417810314055014 07/08/2013 30/08/2013 09/08/2013 06 13 4055014 SDO 135,91 0,68 136,59 On-line QUEBRA** <br />
0,00 <br />
<br />
<br />
<br />**
CON BSE12078 Expresso Bradesco PF 4417810314715013 07/08/2013 09/08/2013 09/08/2013 06 14 4715013 SDO 112,71 0,56 113,27 On-line QUEBRA** <br />
0,00 <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Detalhado de blabla - <br />
12/08/2013 15 51 <br />
Pag. 2 de 9 <br />
<br />
<br />
<br />
<br />
<br />
<br />
**CON BSE12076 Expresso Bradesco PF 4417810315015017 07/08/2013 09/08/2013 09/08/2013 14 44 5015017 SDO 139,42 0,70 140,12 On-line QUEBRA** <br />
0,00 <br />
<br />
<br />
<br />**
CON BSE12095 Expresso Bradesco PF 4417810377227013 07/08/2013 09/08/2013 09/08/2013 05 50 7227013 SDO 105,36 0,53 105,89 On-line
Precisaria eliminar TODO o conteúdo ENTRE as palavras QUEBRA e CON (que começa abaixo). Deixei em negrito o que precisaria eliminar.
Se esse conteúdo seguisse um padrão utilizaria um str_replace() e já resolveria meu problema, mas não é o caso.
Alguém dá uma dica de como poderia fazer isso? To muito enferrujado e não consigo pesquisar (não to sabendo como fazer essa pesquisa pelo menos).
Obrigado!
O problema de utilizar expressões regular, é que o operador guloso utilizado (.*), pode nem sempre ter o comportamento desejado, ainda mais falando em expressões regulares.
Desde que a expressão seja regular, o comportamento será sempre o desejado dentro de uma regex bem formulada.
preg_match_all('/\bCON(?P<texto>.*?)QUEBRA\s<br/m' , $string , $match);
Desta vez, eu tenho que discordar da afirmação.
Não porque não vai funcionar, claro que irá. Mas nesse caso, o operador guloso (específico das ERs) não está fazendo o que lhe foi solicitado, por isso está funcionando. O comportamento do operador guloso pode mudar de linguagem para linguagem.
Teoricamente, ele não deveria funcionar para este exemplo (como demonstrado no link abaixo), pois ele não quer casa tudo e sim entre duas palavras. Mas as características da função fazem ele funcionar com o comportamento que nós esperamos. Assim como você pode ter comportamentos diferentes utilizando modificadores exclusivos da PCRE.
Se você for utilizar em alguns testadores online, poderá ter resultados diferentes com esse mesmo exemplo (eu mesmo já o tive com exemplos diferentes), pois trabalham em linguagens diferentes e com algumas peculiaridades sobre o seu funcionamento. É a mesma história com o mesmo CSS em diferentes navegadores, todos possuem suas peculiaridades e algumas diferenças.
Gabriel, obrigado! Evandro também! ;)
>
Você poderia utilizar de algumas formas, por expressão regular:
preg_match_all('/CON(?P<texto>.*)QUEBRA/' , $string , $match);
var_dump($match['texto']);
Saída:
Usei essa, e a saída bateu 100%...
Mas pergunta ignorante agora... ficou um array ali. Como faço somente pra dar um update no bd no banco de dados com esse retorno no caso:
>
BSE12074 Expresso Bradesco PF 4417810314055014 07/08/2013 07/08/2013 09/08/2013 06 13 4055014 ADT 541,00 2,70 543,70 On-line
BSE12073 Expresso Bradesco PF 4417810314055014 07/08/2013 30/08/2013 09/08/2013 06 13 4055014 SDO 135,91 0,68 136,59 On-line
BSE12078 Expresso Bradesco PF 4417810314715013 07/08/2013 09/08/2013 09/08/2013 06 14 4715013 SDO 112,71 0,56 113,27 On-line
Não to sabendo utilizar essa função que você passou. Desculpe mesmo a ignorância!
$string = "CON BSE12074 Expresso Bradesco PF 4417810314055014 07/08/2013 07/08/2013 09/08/2013 06 13 4055014 ADT 541,00 2,70 543,70 On-line QUEBRA <br />
0,00 <br />
<br />
<br />
<br />
<br />
CON BSE12073 Expresso Bradesco PF 4417810314055014 07/08/2013 30/08/2013 09/08/2013 06 13 4055014 SDO 135,91 0,68 136,59 On-line QUEBRA <br />
0,00 <br />
<br />
<br />
<br />
CON BSE12078 Expresso Bradesco PF 4417810314715013 07/08/2013 09/08/2013 09/08/2013 06 14 4715013 SDO 112,71 0,56 113,27 On-line";
$string = preg_match_all('/CON(?P<texto>.*)QUEBRA/' , $string , $match);
Não tá certo isso né?? Nunca utilizei essa função e to me batendo aqui. :/Lendo o manual, encontrará que o retorno de preg_match_all é o número de ocorrências da expressão regular. Por isso que no meu exemplo eu não utilizei nenhum retorno da função.
O terceiro parâmetro é uma variável ($match), passada como referência, que irá conter todos as ocorrências da expressão regular e cada ocorrência dos grupos inclusos na expressão regular.
Para ler mais sobre expressões regulares, sugiro o Guia de Consulta Rápida do Aurelio Marinho Jargas
Basta você utilizar exatamente como eu passei no exemplo utilizando um foreach, por exemplo.
Você é o cara Gabriel, muito obrigado!!
Você poderia utilizar de algumas formas, por expressão regular:
Saída: [0]=> string(126) " BSE12074 Expresso Bradesco PF 4417810314055014 07/08/2013 07/08/2013 09/08/2013 06 13 4055014 ADT 541,00 2,70 543,70 On-line " [1]=> string(126) " BSE12073 Expresso Bradesco PF 4417810314055014 07/08/2013 30/08/2013 09/08/2013 06 13 4055014 SDO 135,91 0,68 136,59 On-line " [2]=> string(126) " BSE12078 Expresso Bradesco PF 4417810314715013 07/08/2013 09/08/2013 09/08/2013 06 14 4715013 SDO 112,71 0,56 113,27 On-line " [3]=> string(126) " BSE12076 Expresso Bradesco PF 4417810315015017 07/08/2013 09/08/2013 09/08/2013 14 44 5015017 SDO 139,42 0,70 140,12 On-line " }O problema de utilizar expressões regular, é que o operador guloso utilizado (.*), pode nem sempre ter o comportamento desejado, ainda mais falando em expressões regulares.
Eu recomendo o uso de uma estrutura de controle, bem simples, somente algumas linhas de código a mais:
while(($positionStart = strpos($string , $wordStart , $positionEnd)) !== FALSE) { A saída é a mesma.Não vou entrar em mérito de performance.