• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

David Pintassilgo

[Resolvido]-Ajuda com Expressão regular.

52 mensagens neste tópico

Boas.

Eu tenho uma variavel $linha[$i] que contem algo como por exemplo:

CRT MORANGO  POR 500GR C 2                01    1,388 =    15  126  10

O que eu quero é ir buscar o que está entre um espaço vazio e as letras "GR" (neste caso 500).

toda a string contem um e só um valor dentro dessa regra.

já fiz umas porrada de testes e não me safo... ;):):confused: :wallbash:

(eu tb precebo pouco disto, verdade seja dita... :-[ )

Quem é que me salva?  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tem sempre o 'GR' depois do número?

Pode existir outro 'GR' noutra posição que seja antecedido por números e que a seguir venha um espaço?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pode aparecer outro GR (exemplo: AGRO) mas é SEMPRE 3 dígitos entre um espaço vazio e o GR.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual foi o último a que chegamos ontem? o que dava o POR 500GR.

escrevi agora este, vê se dá:

" (.*)GR/sU"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Até ver.. nada.

Eu para já tenho o codigo assim:

(Vejam lá a parte do php, é que já usei um sem numero de manerias e funções)

preg_match_all(".+\s(\d{3})GR.+", $linha[$i], $output, PREG_SET_ORDER);	
foreach ($output as $valor) { echo $valor[1]; }	

edit:

É que o problema tb pode estar algures no php e não só na ER.  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

.+\s(\d{3})GR.+

Isto não serve?

Qual foi o último a que chegamos ontem? o que dava o POR 500GR.

escrevi agora este, vê se dá:

" (.*)GR/sU"

Nenhuma delas funcionou?

E a que te dei ontem, mete aqui para eu ver agora de cabeça mais fresca se consigo corrigir para não aparecer o POR.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

\d*\w*GR\w* -> Retorna 500GR ou 500AGRO

Depois podes fazer um [0-9]* para sacar só os numeros do 500GR é capaz de não ser o melhor regex mas é o que se arranja lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já não me lembro como tinha isto... ;)

A nível do código php, é assim que está bem?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

preg_match_all("\d*\w*GR\w*", $linha[$i], $output, PREG_SET_ORDER);	
foreach ($output as $valor) { echo $valor[1]; }	

dá erro:

Warning: preg_match_all() [function.preg-match-all]: Delimiter must not be alphanumeric or backslash in /opt/lampp/htdocs/scafrutas/calcular.php on line 27

Warning: Invalid argument supplied for foreach() in /opt/lampp/htdocs/scafrutas/calcular.php on line 28

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta lá com o matcher.

$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

Eu nunca usei o regex de php mas tenta lá sem o all.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"| (.*)GR+|U"

E este?

Com o codigo:

preg_match_all("| (.*)GR+|U", $linha[$i], $output, PREG_SET_ORDER);	
foreach ($output as $valor) { echo $valor[1]; }	

Para o exemplo:

CRT MORANGO  POR 500GR C 2                01    1,388 =    15  126  10

Retorna:

MORANGO POR 500
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

preg_match_all("/\d*\w*GR\w*/", $linha[$i], $output, PREG_SET_ORDER);	
foreach ($output as $valor) { echo $valor[1]; }	

E tens o código mal tem de levar // ;) tenta lá assim

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta lá com o matcher.

$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

Eu nunca usei o regex de php mas tenta lá sem o all.

Fasso isso, mas no meu caso em vez de usar o $subject uso a minha variavel $linha[$i], certo?

edit:

Vou então tentar assim:

preg_match_all("/\d*\w*GR\w*/", $linha[$i], $output, PREG_SET_ORDER);	
foreach ($output as $valor) { echo $valor[1]; }	

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

preg_match_all("/\d*\w*GR\w*/", $linha[$i], $output, PREG_SET_ORDER);	
foreach ($output as $valor) { echo $valor[1]; }	

assim não retorna nada.

E assim:

#Encontrar na string o peso da unidade	
$pattern = '/^def/';
preg_match($pattern, substr($linha[$i],3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

Devolve isto:

Array ( )
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

LOL. não podes ter a pattern como '/^def/', isso era um exemplo, tens de ter a pattern como tinhas antes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As patters começam e acabam sempre com / só se em php é diferente ruby e Java é assim.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já não precebo nada disto..:S

Então indo por partes... a nível do php, meto como?

(para depois ser só orientar a ER certa)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

<?php

$array[0] = "CRT MORANGO  POR 500GR C 2                 01     1,388 =    15   126   10";
$array[1] = "CRT MORANGO  POR 214GR C 2                 01     1,388 =    15   126   10";
$array[2] = "CRT MORANGO  POR 387GR C 2                 01     1,388 =    15   126   10";

foreach($array as $linha) {
preg_match("#.+\s(\d{3})GR.+#", $linha, $matches);

echo "<pre>";
print_r($matches);
echo "</pre>";
}

?>

Array
(
    [0] => CRT MORANGO  POR 500GR C 2                 01     1,388 =    15   126   10
    [1] => 500
)

Array
(
    [0] => CRT MORANGO  POR 214GR C 2                 01     1,388 =    15   126   10
    [1] => 214
)

Array
(
    [0] => CRT MORANGO  POR 387GR C 2                 01     1,388 =    15   126   10
    [1] => 387
)

Isto não serve?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

preg_match_all("/ \s(.*)(GR)/", $linha[$i], $output, PREG_SET_ORDER);
foreach ($output as $valor) { echo $valor[1]; } 

E vai-te dar POR 500 certo?

EDIT

O Nazgulled já te deu a resposta ;)

Agora só tens de pôr assim:

preg_match("#.+\s(\d{3})GR.+#", $linha[$i], $matches);
echo $matches[1];

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

preg_match_all("/ \s(.*)(GR)/", $linha[$i], $output, PREG_SET_ORDER);
foreach ($output as $valor) { echo $valor[1]; } 

E vai-te dar POR 500 certo?

EDIT

O Nazgulled já te deu a resposta:P

Assim devolve-me POR 500.

Será que estou praqui a fazer outra coisa qq mal antes disto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ORAAAA marvilha!!! :D:D:D:D:D

OBRIGADÃO!!!!!!!!!!!

Nazgulled,.. tás lá! :D;)  ;)

Skin! Agora é que foi! eheh  ;)

OBrigado a todos pelo tempo despendido! :) Estava a ficar mesmo á rasca! :D  :):confused::thumbsup: :thumbsup: :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que se está a criar aqui uma confusão entre o preg_match e o preg_match_all...

Tipo, o preg_match_all serve para encontrar todas as referências, imagina por exemplo um texto de um post aqui no fórum, onde usas as tags [ b ] palavra [ /b ] para colocar negritos e querias encontrar todas as palavras a negrito, nesse caso usavas o preg_match_all no texto.

No exemplo que tu dês-te, tens um array, que eu supôs que em cada posição do array, tens uma linha igual a que apresentaste no primeiro post. Neste caso tens de fazer um ciclo para percorrer o array e usar o preg_match para cada posição do array e encontrar o valor que queres.

Tanto quanto eu sei e pelos exemplos de código que deste, não podes usar o preg_match_all para aquilo que queres fazer...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora