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连成一线
- 第一场比赛是非贪婪的,它将在第二场比赛开始时停止
这将使你:
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连成一线
- 第一场比赛是非贪婪的,它将在第二场比赛开始时停止
这将使你:
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)是纬度,哪个是经度?南北是纬度,东西是经度: