你可能会使用
!3d(-?\d+(?:\.\d+)?)!4d(-?\d+(?:\.\d+))
要匹配 1+ 个数字,您可以使用 + 而不是 *,否则单个点也会匹配。
-
!3d 字面匹配
-
(-?\d+(?:\.\d+)?) 匹配可选的- 数字和可选的小数部分
-
!4d 字面匹配
-
(-?\d+(?:\.\d+)) 匹配可选的- 数字和可选的小数部分
Regex demo
您也可以使用parse_url,获取路径,在/ 上拆分并获取最后一部分并在捕获组1 中获取以!3d 或!4d 开头的值和2.
$str = "https://www.google.com.br/maps/place/Abbraccio+Cucina+Italiana/@-15.7202756,-47.9207687,13z/data=!4m9!1m3!2m2!1srestaurants+in+Bras%C3%ADlia+-+Brasilia,+Federal+District!6e5!3m4!1s0x935a39a1395ec361:0x5c869291493e902c!8m2!3d-15.7202756!4d-47.8857498";
$parts = explode('/', parse_url($str)["path"]);
$lastPart = end($parts);
preg_match("~!3d(-?\d+(?:\.\d+)?)!4d(-?\d+(?:\.\d+))~", $lastPart, $matches);
print_r($matches);
输出
Array
(
[0] => !3d-15.7202756!4d-47.8857498
[1] => -15.7202756
[2] => -47.8857498
)