Pegar valores entre caracteres

112 views
Skip to first unread message

Anderson Fraga

unread,
Sep 16, 2009, 10:29:32 AM9/16/09
to expressoes...@googlegroups.com
Olá grupo!
 
    Atualmente, tenho a seguinte expressão regular:
        ([a-zA-Z0-9_]+)(\:([0-9]+)(\>([0-9]+)+)+)?
   
    Ao testar com um valor " teste:12>45 ", por exemplo, ele me retorna o seguinte:
 
Match 1: teste
Match 2: :12>45
Match 3: 12
Match 4: >45
Match 5: 45
 
    Pois bem. Gostaria de saber como eu poderia retornar apenas 3 match's (no caso acima, eu gostaria apenas do 1, 3 e 5 (valores 'teste', '12' e '45')).
 
    Alguma idéia?
 
Abraços!
 
 

Thalles Robson

unread,
Sep 16, 2009, 10:42:16 AM9/16/09
to expressoes...@googlegroups.com
Olhe ae Anderson.

<?php

$texto = <<<TEXT0
teste:12>45
TEXT0;

$pattern = '([a-zA-Z0-9_]+)\:([0-9]+)\>([0-9]+)';

ereg( $pattern, $texto, &$match);
array_shift( $match );

print_r($match);

?>

O Resultado:

Array
(
[0] => teste
[1] => 12
[2] => 45
)




2009/9/16 Anderson Fraga <gro...@andersonfraga.net>



--
Thalles Robson

"Um plano só é bom nas mãos de quem pode executá-lo"

Starwars

----

thalle...@yahoo.co.uk
thal...@gmail.com
thalle...@yahoo.com.br

Felipe Pena

unread,
Sep 16, 2009, 10:45:51 AM9/16/09
to expressoes...@googlegroups.com
2009/9/16 Anderson Fraga <gro...@andersonfraga.net>

Olá grupo!
 
    Atualmente, tenho a seguinte expressão regular:
        ([a-zA-Z0-9_]+)(\:([0-9]+)(\>([0-9]+)+)+)?
   
    Ao testar com um valor " teste:12>45 ", por exemplo, ele me retorna o seguinte:
 
Match 1: teste
Match 2: :12>45
Match 3: 12
Match 4: >45
Match 5: 45
 
    Pois bem. Gostaria de saber como eu poderia retornar apenas 3 match's (no caso acima, eu gostaria apenas do 1, 3 e 5 (valores 'teste', '12' e '45')).
 
    Alguma idéia?
 

Olá, para isto você precisará usar o chamado "grupo fantasma", que funciona como o grupo, excepto que ele não cria o que chamamos de backreferences.

Exemplo:

$ pcretest
PCRE version 7.8 2008-09-05

re> /([a-zA-Z0-9_]+)(?:\:([0-9]+)(?:\>([0-9]+)+)+)?/
data> teste:12>45
0: teste:12>45
1: teste
2: 12
3: 45

--
Regards,
Felipe Pena

Thalles Robson

unread,
Sep 16, 2009, 11:16:05 AM9/16/09
to expressoes...@googlegroups.com
Opss. Me perdoe, eu pensei que estava no grupo do PHP.

#fail

2009/9/16 Thalles Robson <thal...@gmail.com>

Anderson Fraga

unread,
Sep 16, 2009, 12:28:45 PM9/16/09
to expressoes...@googlegroups.com
Thalles
No seu regex, ele só me retorna caso os 3 grupos existirem. Eu precisaria que, caso existisse só o primeiro, retornasse ele. Se existisse :xx, onde xx é um número, retornasse o 1° e o 2° grupo. Caso fosse teste:12>14, retornaria os 3 grupos.
 
Felipe
Seu regex caiu na mesma situação do regex do Thalles.
 
Ou seja:
    'teste', retornará apenas [0] = teste
    'teste:12', retornará [0] = teste, [1] = 12
    'teste:12>14', retornará [0] = teste, [1] = 12, [2] = 14
    'teste>14', retornará apenas [0] = teste
 
Teria como?
 
Abraços!
 

Thalles Robson

unread,
Sep 16, 2009, 1:58:12 PM9/16/09
to expressoes...@googlegroups.com
Que dureza em Anderson.

Rapaz, só por REGEX eu sinceramente não sei como resolver.

Você poderia considerar utilizar construções da procedurais da própria linguagem de programação para tratar o que foi casado.

O que eu consegui foi isso:

<?php

// 'teste', retornará apenas [0] = teste
$pattern = '/(([a-zA-Z0-9_]+)([:]([0-9])+(\>([0-9]+))?)?)/';
preg_match( $pattern, "teste", &$match);
printf(" 'teste' ");
print_r($match);

// 'teste:12', retornará [0] = teste, [1] = 12
$pattern = '/(([a-zA-Z0-9_]+)([:]([0-9]+)(\>([0-9]+))?)?)/';
preg_match( $pattern, "teste:12", &$match);
printf(" 'teste:12' ");
print_r($match);

// 'teste:12>14', retornará [0] = teste, [1] = 12, [2] = 14
$pattern = '/(([a-zA-Z0-9_]+)([:]([0-9]+)(\>([0-9]+))?)?)/';
preg_match( $pattern, "teste:12>14", &$match);
printf(" 'teste:12>14' ");
print_r($match);

// 'teste>14', retornará apenas [0] = teste
$pattern = '/(([a-zA-Z0-9_]+)([:]([0-9]+)(\>([0-9]+))?)?)/';
preg_match( $pattern, "teste>14", &$match);
printf(" 'teste>14' ");
print_r($match);
?>

O Resultado:

'teste' Array
(
[0] => teste
[1] => teste
[2] => teste
)
'teste:12' Array
(
[0] => teste:12
[1] => teste:12
[2] => teste
[3] => :12
[4] => 12
)
'teste:12>14' Array
(
[0] => teste:12>14
[1] => teste:12>14
[2] => teste
[3] => :12>14
[4] => 12
[5] => >14
[6] => 14
)
'teste>14' Array
(
[0] => teste
[1] => teste
[2] => teste
)



Anderson Fraga

unread,
Sep 16, 2009, 2:05:07 PM9/16/09
to expressoes...@googlegroups.com
Rsrsrsrs
 
Bom, a única maneira que consegui até agora foi essa:
    ([a-zA-Z0-9_]+)(\:([0-9]+)(\>?([0-9]+)+)?+)?
 
Nele, pelo o que testei, satisfaz todas as condições.
O único problema é que ele retorna 5 resultados, e não 3 como eu gostaria.
 
Mas, se não tem como melhorar, está ótimo então :)
 
Agradeço a ti e ao Felipe que ajudaram ;)

Felipe Pena

unread,
Sep 16, 2009, 2:11:13 PM9/16/09
to expressoes...@googlegroups.com
2009/9/16 Anderson Fraga <gro...@andersonfraga.net>

Rsrsrsrs
 
Bom, a única maneira que consegui até agora foi essa:
    ([a-zA-Z0-9_]+)(\:([0-9]+)(\>?([0-9]+)+)?+)?
 
Nele, pelo o que testei, satisfaz todas as condições.
O único problema é que ele retorna 5 resultados, e não 3 como eu gostaria.
 
Mas, se não tem como melhorar, está ótimo então :)
 
Agradeço a ti e ao Felipe que ajudaram ;)
 

Ué, a que eu fiz não lhe serviu?

--
Regards,
Felipe Pena

Anderson Fraga

unread,
Sep 16, 2009, 2:19:49 PM9/16/09
to expressoes...@googlegroups.com
Opa!
 
    Bah, me desculpa!
    Testei o teu regex novamente e, adivinha? Funcionou!
    Devo ter confundido ou algo do gênero :$
 
    Funcionou 100%, e sem o chamado 'grupo fantasma' :D
 
Obrigado mesmo e desculpe-me pela bela 'gafe' rsrsrs
 
Abraços!
 
----- Original Message -----
Sent: Wednesday, September 16, 2009 3:11 PM
Subject: [Grupo-Regex] Re: Pegar valores entre caracteres

Thalles Robson

unread,
Sep 16, 2009, 2:40:35 PM9/16/09
to expressoes...@googlegroups.com
Legal esse negócio do grupo fantasma, não sabia!

Valeu Felipe.

2009/9/16 Anderson Fraga <gro...@andersonfraga.net>
Reply all
Reply to author
Forward
0 new messages