Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从字符串中提取long/lat_Php_Regex - Fatal编程技术网

Php 从字符串中提取long/lat

Php 从字符串中提取long/lat,php,regex,Php,Regex,嗨 我有一个可以包含经度和纬度的字符串。字符串可以包含任何内容,但如果它确实包含lon/lat,那么我想使用php提取它。我想我需要一个正则表达式,但我不知道如何得到它。字符串可以包含任何内容: 一个随机字符串DFF33338983 33.707352,-116.272797更多dfdfndfdf如果该字符串可以包含任何内容,那么就没有正则表达式,也没有任何代码可以提取经度和纬度 这可以通过以下字符串进行确认: 7.123456,40.404040 is nothing like 33.7073

我有一个可以包含经度和纬度的字符串。字符串可以包含任何内容,但如果它确实包含lon/lat,那么我想使用php提取它。我想我需要一个正则表达式,但我不知道如何得到它。字符串可以包含任何内容:


一个随机字符串DFF33338983 33.707352,-116.272797更多dfdfndfdf

如果该字符串可以包含任何内容,那么就没有正则表达式,也没有任何代码可以提取经度和纬度

这可以通过以下字符串进行确认:

7.123456,40.404040 is nothing like 33.707352,-116.272797 or 99.111222,-22.333444.
哪一个是纬度

您可以尝试以下方法:

\b-?\d+\.\d{6},-?\d+\.\d{6}\b

作为一个起点。

如果字符串可以包含任何内容,那么就没有正则表达式,或者任何可以提取经度和纬度的代码

这可以通过以下字符串进行确认:

7.123456,40.404040 is nothing like 33.707352,-116.272797 or 99.111222,-22.333444.
哪一个是纬度

您可以尝试以下方法:

\b-?\d+\.\d{6},-?\d+\.\d{6}\b

作为起点。

您可以使用以下方法进行匹配:

.*\s(.*),(.*?)\s.*
请参阅中的答案

用php回答:

$txt = "dfdff333 38983 33.707352,-116.272797 dfd fndfdf";
$lat = preg_replace("/.*\s(.*),.*?\s.*/", "$1", $txt);
$lon = preg_replace("/.*\s.*,(.*?)\s.*/", "$1", $txt);

echo $lat."\n"; // 33.707352
echo $lon."\n"; // -116.272797
注意:我使用逗号作为分隔符


编辑:您可以使用更具体的正则表达式,如

$lat = preg_replace("/.*\s(-?\d+\.\d+),-?\d+\.\d+?\s.*/", "$1", $txt);
$lon = preg_replace("/.*\s-?\d+\.\d+,(-?\d+\.\d+?)\s.*/", "$1", $txt);

Tks@soapbox

您可以使用以下方法进行匹配:

.*\s(.*),(.*?)\s.*
请参阅中的答案

用php回答:

$txt = "dfdff333 38983 33.707352,-116.272797 dfd fndfdf";
$lat = preg_replace("/.*\s(.*),.*?\s.*/", "$1", $txt);
$lon = preg_replace("/.*\s.*,(.*?)\s.*/", "$1", $txt);

echo $lat."\n"; // 33.707352
echo $lon."\n"; // -116.272797
注意:我使用逗号作为分隔符


编辑:您可以使用更具体的正则表达式,如

$lat = preg_replace("/.*\s(-?\d+\.\d+),-?\d+\.\d+?\s.*/", "$1", $txt);
$lon = preg_replace("/.*\s-?\d+\.\d+,(-?\d+\.\d+?)\s.*/", "$1", $txt);


Tks@soapbox

哦,好的。我的想法是这样的…如果字符串中有一个整数,如果这个数字有一个2或3个字符的点,那么我几乎可以确定它是一个经度…从那里把整个字符串一直带到下一个逗号。这将给你经度…然后寻找负号和一个字符,把字符串带到下一个空格,这将给你lat。它不需要是完美的…只要我大部分时间都能得到它就好了。这是不可行的吗?事实上,这是行不通的,因为有时长lat可以从负号开始,而其他的则不可行t@elduderino,这与“字符串可以包含任何内容”有很大不同:-)请看一下我作为起点提供的正则表达式。您可以使用
来指示零次或一次出现。请注意,没有理由说明lat/lon组合必须包含小数点。60,10是一个完全有效的坐标。如果您的输入取决于语言环境,小数点甚至可以替换为逗号。哦,好的。我的想法是这样的…如果字符串中有一个整数,如果这个数字有一个2或3个字符的点,那么我几乎可以确定它是一个经度…从那里把整个字符串一直带到下一个逗号。这将给你经度…然后寻找负号和一个字符,把字符串带到下一个空格,这将给你lat。它不需要是完美的…只要我大部分时间都能得到它就好了。这是不可行的吗?事实上,这是行不通的,因为有时长lat可以从负号开始,而其他的则不可行t@elduderino,这与“字符串可以包含任何内容”有很大不同:-)请看一下我作为起点提供的正则表达式。您可以使用
来指示零次或一次出现。请注意,没有理由说明lat/lon组合必须包含小数点。60,10是一个完全有效的坐标。如果您的输入取决于区域设置,小数点甚至可以替换为逗号。我们是否假设字符串中没有固定位置来表示经度和纬度?它们能按相反的顺序排列吗?请提供更多详细信息。不,遗憾的是,长/lat可能位于字符串中的任何位置。它们可能出现相反的顺序,因为有时长或lat前面有一个负号,而其他的则不在你等待麻烦发生的时候。经度值的范围为-180到180。纬度范围从-90到90。你打算如何解释像-38.02342,48.09812这样的东西?那么你怎么知道哪一个是经度和纬度呢?我们是否假设字符串中没有固定的位置来表示经度和纬度?它们能按相反的顺序排列吗?请提供更多详细信息。不,遗憾的是,长/lat可能位于字符串中的任何位置。它们可能出现相反的顺序,因为有时长或lat前面有一个负号,而其他的则不在你等待麻烦发生的时候。经度值的范围为-180到180。纬度范围从-90到90。你打算如何解释像-38.02342,48.09812这样的东西?那你怎么知道哪个是经度和纬度呢?这似乎很好用…但我真的需要用英语来做。这个正则表达式在PHP中工作吗?现在检查答案。我改为php回答:)我不赞成使用。*来匹配数字。您应该使用
-?\d+\.\d+
,因为它们具有定义良好的格式。使用。*这里将匹配所有其他意想不到的事情。这似乎工作得很好…但我真的需要这样做。这个正则表达式在PHP中工作吗?现在检查答案。我改为php回答:)我不赞成使用。*来匹配数字。您应该使用
-?\d+\.\d+
,因为它们具有定义良好的格式。使用。*此处将匹配所有其他意外事件。