Hızlı sıradanifade bir dize ayrıştırma için gerekli

5 Cevap php

Ben aşağıdaki biçimde bir kaç dizeleri var:

S25 22.087 E152 46.125
S23 32.230 E148 10.576
S25 00.039 E152 12.480
S26 19.496 E152 43.501

I would like to parse the strings and split them into two parts, so: $foo = 'S25 22.087 E152 46.125';

olacak:

$foo[0] = 'S25 22.087';
$foo[1] = 'E152 46.125';

(Bir dizide olmak zorunda değildir, iki yeni değişkenler de iyi çalışır).

Bu nasıl yapılabilir? Ben doğrusu E poz bulma ve substr() yapıyor daha bir sıradanifade kullanmasını tercih ederim.

5 Cevap

S25 22.087 E152 46.125 Bana bir enlem ve boylam konumu değer gibi görünüyor. Bu yüzden de bekliyoruz N25 22.087 W152 46.125 ve de bu ayrıştırmak gerekir.

$foo = 'S25 22.087 E152 46.125';
$matches = array();
if (preg_match('/^([NS].*)\s([EW].*)$/', $foo, $matches)) {
	var_dump($matches); // $matches[1] = 'S25 22.087'; $matches[2] = 'E152 46.125'
}

Nasıl hakkında:

$foo = 'S25 22.087 E152 46.125';
$foo_parts = explode(' ', $foo);
$foo = array(implode(array($foo_parts[0], $foo_parts[1])), implode(array($foo_parts[2], $foo_parts[3])));

Düzenli ifadeler :)

Ne bu böyle bir şey:

$foo = 'S25 22.087 E152 46.125';
$m = array();
if (preg_match('/^(.*?)(E.*)$/', $foo, $m)) {
        var_dump($m);
}

Fikir, burada, yo olmak:

  • açgözlü olmayan modda dizenin başından itibaren her şeyi almak
  • dizenin sonuna kadar, E ile yıldızlar şeyi almak için
  • ikinci maç başladığında olmayan açgözlü olmanın ilk maç, bu durdururuz.

(Of course, there are plenty of other possible ways to do that -- like matching everything but E for the first part, for instance)


Which will get you :

array(3) {
  [0]=>
  string(22) "S25 22.087 E152 46.125"
  [1]=>
  string(11) "S25 22.087 "
  [2]=>
  string(11) "E152 46.125"
}

Daha sonra sadece $m[1] ve $m[2] kullanmak zorunda.

Not: Ayrıca, her birinin başında veya sonunda hiçbir boşluk olmadığından emin olmak için, iki dizeleri Döşeme kullanmak gerekecek.

Bu normal ifade deneyin:

/(S\d+ [\d.]+) (E\d+ [\d.]+)/

Tüm bu çizgiler aynı uzunlukta ve aynı hassas iseniz, sadece bunu böyle yapın:

$line = 'S25 22.087 E152 46.125';
$posH = substr( $line,  0, 10 );
$posV = substr( $line, 11, 11 );

Yani herhangi sıradanifade yaklaşım daha hızlı olmalıdır.