解析字符串需要快速正则表达式

时间:2009-12-13 14:49:56

标签: php regex

我有以下格式的几个字符串:

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

我想解析字符串并将它们分成两部分,所以: $ foo ='S25 22.087 E152 46.125';

会变成:

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

(它不必在数组中,两个新变量也可以正常工作)。

如何做到这一点?我更喜欢使用正则表达式,而不是找到E的冒充并执行substr()

6 个答案:

答案 0 :(得分:2)

对我来说,{p> S25 22.087 E152 46.125看起来像是纬度和经度位置值。所以你也应该期待N25 22.087 W152 46.125并且能够解析它。

$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'
}

答案 1 :(得分:1)

怎么样:

$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])));

没有正则表达式:)

答案 2 :(得分:0)

这样的事情:

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

这个想法,在这里,哟:

  • 以非贪婪模式从字符串的开头获取所有内容
  • 获取与E一起出星的所有内容,直到字符串的末尾
  • 第一场比赛非贪婪,第二场比赛开始时就会停止。

(当然,还有很多其他可能的方法可以做到这一点 - 例如,匹配第一部分除了E之外的所有内容)


哪个会帮到你:

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

然后,您必须仅使用$m[1]$m[2]

注意:你还必须在两个琴弦上使用修剪,以确保每个琴弦的开头或末尾没有空格。

答案 3 :(得分:0)

试试这个正则表达式:

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

答案 4 :(得分:0)

$foo = 'S25 22.087 E152 46.125';
preg_match_all('~[A-Z]\d+\s+[\d.]+~', $foo, $parts, PREG_SET_ORDER);
$parts = array_map('reset', $parts);
print_r($parts);

答案 5 :(得分:0)

如果所有这些行的长度和精度相同,只需这样做:

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

这应该比任何正则表达式方法都快。