我正在尝试从位置信息字符串中获取纬度和经度值。
如果我在地图上搜索“夏威夷”,则地图api将返回如下字符串值。
$ location = {map:geo =“ 20.471884 , -157.505 ,6” p =“ Hawaii”}
我想将纬度和经度值计入$ lat,$ lng。
如何在php中实现??
答案 0 :(得分:1)
如果您不想在没有,6
之后匹配该模式,则可以使用:
^{map:\h+geo="(?P<lat>-?\d+(?:\.\d+)?)(?:,\d+)?,(?P<lon>-?\d+(?:\.\d+)?)(?:,\d+)?"[^}]+}
说明
^{map:\h+geo=
字符串的开头,匹配{map:
和1+水平空白和geo="
(?P<lat>
命名为捕获组lat
-?\d+
匹配可选的-,1个以上数字(?:\.\d+)?
是.
和1个以上数字的可选部分)
关闭群组(?:,\d+)?
是,
和1个以上数字的可选部分,
值之间的逗号(?P<lon>
命名为捕获组lon
-?\d+
匹配可选的-,1个以上数字(?:\.\d+)?
是.
和1个以上数字的可选部分)
关闭群组(?:,\d+)?
是,
和1个以上数字的可选部分"[^}]+}
匹配“,然后直到结束}
例如
$re = '/^{map:\h+geo="(?P<lat>-?\d+(?:\.\d+)?)(?:,\d+)?,(?P<lon>-?\d+(?:\.\d+)?)(?:,\d+)?"[^}]+}/';
$str = '{map: geo="20.471884,-157.505,6" p="Hawaii"}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
$lat = $matches[0]["lat"];
$lon = $matches[0]["lon"];
echo $lat; // 20.471884
echo PHP_EOL;
echo $lon; // -157.505
您可以通过使用(?1)
递归第一个子模式来稍微缩短模式
^{map:\h+geo="(?P<lat>-?\d+(?:\.\d+)?)(?:,\d+)?,(?P<lon>(?1))(?:,\d+)?"[^}]+}
答案 1 :(得分:0)
也许您需要这样的东西
<?php
$re = '/(["\'])(\\\\?.)*?\1/';
$str = '{map: geo="20.471884,-157.505,6" p="Hawaii"}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
在这里测试:http://sandbox.onlinephpfunctions.com/code/e858fca9b0ba65d59919f28ae2a228db5e7610da