Regex para separar params usando preg_match

Atualmente, estou usando esta regex:

/([-0-9]+).([-0-9]+).([-0-9]+).([-0-9]+).(.*?).([-0-9]).([-0-9]+).([-0-9.]+).([-0-9.]+).([-0-9.]+).*/i

para combinar esse tipo de coisa:

1 0 61 12345678 sierra007^7 0 0 123.123.123.123:524 26429 25000

O problema que estou tendo é que o nome sierra007^7 realmente aparece como sierr e depois tudo depois que ele está quebrado. O que eu preciso é para o .*? parte para combinar com qualquer coisa, então continue dividindo-a depois. Se mudar o .*? para .* coloca o resto da informação como o mesmo parâmetro.

Alguém pode prestar alguns conselhos, por favor?

Obrigado.

Talvez eu realmente não vejo o que você precisa, mas porque não use apenas explode() para dividir sua corda?

Por exemplo, esta parte do código:

 $str = '1 0 61 12345678 sierra007^7 0 0 90.199.42.51:524 26429 25000'; $array = explode(' ', $str); var_dump($array); 

Você obtê-lo:

 array 0 => string '1' (length=1) 1 => string '0' (length=1) 2 => string '61' (length=2) 3 => string '12345678' (length=8) 4 => string 'sierra007^7' (length=11) 5 => string '0' (length=1) 6 => string '0' (length=1) 7 => string '90.199.42.51:524' (length=16) 8 => string '26429' (length=5) 9 => string '25000' (length=5) 

Em vez de (.*?) Use [^ ]+ isso deve ser muito mais rápido e funcionar como você indençou.

Eu sei que o cartaz original tem uma solução aceita (o que funciona muito bem), mas permita-me responder a questão específica de por que o regex não estava funcionando. O problema é o uso do ponto . – e este é um erro muito comum. O ponto é um curinga que raramente é necessário ou apropriado. Nesse caso, o ponto está sendo usado para separar um grupo de grupos de dígitos. Mas os dados sugerem que esses campos estão separados por espaços. A solução é simples; Em vez do ponto, separe os campos com espaço em branco. Também o ponto está sendo usado na forma de uma expressão de ponto-estrela preguiçosa , que também é inapropriada neste caso. Aqui é como eu escrevi esta regex (no modo detalhado com comentários):

 $re = '/ ^ # Anchor to start of line. ([-0-9]+) \s+ # $1: Field 1 ([-0-9]+) \s+ # $2: Field 2 ([-0-9]+) \s+ # $3: Field 3 ([-0-9]+) \s+ # $4: Field 4 (\S+) \s+ # $5: Field 5 ([-0-9]) \s+ # $6: Field 6 ([-0-9]+) \s+ # $7: Field 7 ([-0-9.:]+)\s+ # $8: Field 8 ([-0-9.]+) \s+ # $9: Field 9 ([-0-9.]+) # $10: Field 10 /mx'; 

Esta regex é muito mais precisa e combinará (e deixará de corresponder) muito mais rápido como resultado.

Outro problema com o regex original é que os dados no campo # 8 da cadeia de exemplo contém um dois-pontos, que não está especificado na oitava expressão regex (ou seja, o "sierr" não era o único campo que estava incorretamente correspondente).

Observe que a solução regex tem a vantagem de escolher registros correspondentes dentro de um corpo maior de texto com formato variável e variável, onde a solução explodir exige que cada string tenha um formato válido e conhecido (o que provavelmente é o caso aqui , então a solução de explosão deve ser preferida).