【发布时间】:2011-06-14 17:44:12
【问题描述】:
我需要使用 php 从字符串中提取经纬度坐标。字符串将始终被格式化为:
"(42.32783298989135, -70.99989162915041)"
但是,每个值的长度会因用途而异。提取值的最佳方法是什么?谢谢!
【问题讨论】:
我需要使用 php 从字符串中提取经纬度坐标。字符串将始终被格式化为:
"(42.32783298989135, -70.99989162915041)"
但是,每个值的长度会因用途而异。提取值的最佳方法是什么?谢谢!
【问题讨论】:
您可以使用 sscanf 来执行此操作:
sscanf($string, '"(%f, %f)"', $lat, $lng);
测试:
php > sscanf('"(42.32783298989135, -70.99989162915041)"', '"(%f, %f)"', $lat, $lng);
php > var_dump($lat, $lng);
float(42.327832989891)
float(-70.99989162915)
【讨论】:
$withoutParentheses = substr($string, 1, -1);
$coordinates = explode(', ', $coordinates);
$longitude = floatval($coordinates[0]);
$latitude = floatval($coordinates[1]);
【讨论】:
substr代替trim。
您可以使用正则表达式从括号中提取数字,然后使用explode 命令将数字拆分为一个数组。
您的正则表达式将类似于
/(-?[0-9]+.[0-9]+, -?[0-9]+.[0-9]+)/
您的爆炸命令的分隔符将是一个逗号。
【讨论】:
这是我自己想出来的:
function LatFromString($mCenterString){
//(42.32783298989135, -70.99989162915041)
$mLatLong = explode(",", $mCenterString);
$mLat = '';
if(count($mLatLong) == 2){
$mLat = substr($mLatLong[0], 1);
}
return $mLat;
}
function LongFromString($mCenterString){
//(42.32783298989135, -70.99989162915041)
$mLatLong = explode(",", $mCenterString);
$mLat = '';
if(count($mLatLong) == 2){
$mLong = substr($mLatLong[1], 0, -1);
}
return $mLong;
}
这看起来怎么样?
【讨论】:
你可以这样做:
$str = "(42.32783298989135, -70.99989162915041)";
function extractlatlong($str){
$latlong = explode(",",$str);
if(count($latlong) == 2){
$lat = preg_replace("%[^0-9.]%","",$latlong[0]);
$long = preg_replace("%[^0-9.]%","",$latlong[1]);
return array("lat"=>$lat,"long"=>$long);
} else {
return NULL;
}
}
print_r(extractlatlong($str));
【讨论】:
如果您想使用sscanf()(我可能会),但又不想因为将数值转换为浮点数而失去任何精度,那么请使用几个否定字符类。您不必匹配尾随的 ) 来提取您需要的内容。
代码:(Demo)
$latlon = "(42.32783298989135, -70.99989162915041)";
sscanf($latlon, '(%[^,], %[^)]', $lat, $lon);
var_export([$lat, $lon]);
输出为字符串数组:
array (
0 => '42.32783298989135',
1 => '-70.99989162915041',
)
或者,如果您只想要两个值的索引数组,如上面的输出:
var_export(sscanf($latlon, '(%[^,], %[^)]'));
【讨论】: