如何从不断变化的字符串值中获取具体数字;的PHP

时间:2019-06-01 09:54:21

标签: php string preg-match

我正在尝试从位置信息字符串中获取纬度和经度值。

如果我在地图上搜索“夏威夷”,则地图api将返回如下字符串值。

$ location = {map:geo =“ 20.471884 -157.505 ,6” p =“ Hawaii”}

我想将纬度和经度值计入$ lat,$ lng。

如何在php中实现??

2 个答案:

答案 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个以上数字的可选部分
  • "[^}]+}匹配“,然后直到结束}

Regex demo | Php demo

例如

$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