Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解析字符串所需的快速regexp_Php_Regex - Fatal编程技术网

Php 解析字符串所需的快速regexp

Php 解析字符串所需的快速regexp,php,regex,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'; (它不必在数组中,两个新变量也可以正常工作) 如何做到这一点?我更喜欢使用r

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

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';
(它不必在数组中,两个新变量也可以正常工作)


如何做到这一点?我更喜欢使用regexp,而不是找到E的姿势并执行
substr()

这样的操作怎么样:

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


注意:您还必须在两个字符串上使用trim,以确保每个字符串的开头或结尾都没有空格。

类似这样的内容如何:

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


注意:您还必须在两个字符串上使用trim,以确保每个字符串的开头或结尾没有空格。

尝试以下正则表达式:

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

请尝试以下正则表达式:

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

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

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'
}
那么:

$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])));
没有正则表达式:)

怎么样:

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

没有正则表达式:)

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

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

这应该比任何regexp方法都快。

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

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

这应该比任何regexp方法都要快。

这种格式有几个多行字符串,还是只列出了四个单行字符串?正如你在答案中看到的那样,这有点不同。你应该使用explode/infrade+数组函数(如果你想将它们放入数组中)而不是regex来完成这样的任务。我不是说你不能使用regex,只是如果出现问题,regex更难阅读和调试。我想对那些使用正则表达式的答案进行向下投票。在这种格式中有几个多行字符串,还是只列出了四个单行字符串?正如你在答案中看到的那样,这有点不同。你应该使用explode/infrade+数组函数(如果你想将它们放入数组中)而不是regex来完成这样的任务。我不是说你不能使用regex,只是如果出现问题,regex更难阅读和调试。我想否决那些使用正则表达式的答案。你是否知道这两个答案中的哪一个(S25 22.087/E152 46.125)是纬度,哪一个是经度?南北是纬度,东西是经度:你是否知道这两个答案中的哪一个(S25 22.087/E152 46.125)是纬度,哪个是经度?南北是纬度,东西是经度: