Php 两个纬度和经度的正则表达式不工作

Php 两个纬度和经度的正则表达式不工作,php,mysql,regex,google-maps,preg-match,Php,Mysql,Regex,Google Maps,Preg Match,我使用的一些数据为谷歌地图提供了路径,或者是一条路径,或者是一组两个纬度和经度。我已将这两个值作为BLOB存储在mySql数据库中,但我需要在结果中显示非路径的值。为了做到这一点,我已将它们以以下格式保存在BLOB中: Arrayla,液化天然气+lat,液化天然气 我正在使用preg_match查找这些结果,但我还没有找到任何结果。以下是我尝试过的正则表达式代码: ^[a]{1}[r]{2}[a]{1}[y]{1}[\(]{1}[1-9\.\,\+]{1*}[\)]{1}^ ^[a]{1}[

我使用的一些数据为谷歌地图提供了路径,或者是一条路径,或者是一组两个纬度和经度。我已将这两个值作为BLOB存储在mySql数据库中,但我需要在结果中显示非路径的值。为了做到这一点,我已将它们以以下格式保存在BLOB中:

Arrayla,液化天然气+lat,液化天然气

我正在使用preg_match查找这些结果,但我还没有找到任何结果。以下是我尝试过的正则表达式代码:

^[a]{1}[r]{2}[a]{1}[y]{1}[\(]{1}[1-9\.\,\+]{1*}[\)]{1}^

^[a]{1}[r]{2}[a]{1}[y]{1}[\(]{1}(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)\+(\-?\d+(\.\d+)?),(\-?\d+(\.\d+)?)[\)]{1}^
Regex有时让我感到困惑,就像现在一样。有人能帮我吗

编辑:

lat可以是2位数字,后跟一个小数点和8位以上;lng可以是3位数字,后跟一个小数点和8位以上。两者都可以是积极的或消极的

以下是一些lat lngs示例:

51.511600,-0.12766000

-53.36442000132.27519000

51.50628000,0.12699000

-51.50628000,-0.12699000

所以一场完整的比赛看起来像:

阵列51.5116000,-0.12766000+-53.36442000132.27519000

进一步编辑


我正在使用preg_match php函数来匹配正则表达式。

以下是一些编写正则表达式的指针:

如果一个字符只有一种可能,例如数组中的a,那么您确实可以将其写成[a];然而,你也可以把它写成一个

如果您希望恰好匹配某个对象中的一个,您确实可以将其作为{1}来编写,但是,您也可以将其作为a来编写

运用这些技巧,你的^[a]{1}[r]{2}[a]{1}[y]{1}[\]{1}[1-9\.\,\+]{1*}[\]{1}^的例子减少到^array\[1-9\.\,\+]{1*}^这当然是一个改进

接下来,数字可能还包括0以及1-9。事实上,通常使用\d(任意数字)代替1-9

您正在使用^作为分隔符-通常是/;一开始我不认识它。我不确定您可以使用什么作为分隔符,因此,为了以防万一,我将把它改为通常的/。这使得上面的regex/array\[\d\.\,\+]{1*}\/

要匹配一个或多个字符或字符集,请使用+,而不是{1*}。这使您的查询/数组\[\d\.\,\+]+\/

然后,若要收集结果数字,假设只需要括号之间的部分,请将其放在非转义括号中,因此:/array\[\d\.\,\+]+\/-然后需要将它们拆分,先按+,然后按,。或者,如果正好有两个lat、lng对,您可能需要:/array\[\d\.]+,[\d\.]+\+[\d\.]+,[\d\.]+\/-这将返回4个值,每个值一个;附加的stuff+,将被删除,因为它不在未替换的括号中

编辑:如果你想要负的长和宽,为什么不呢?您需要\-?在适当位置的文字范围,而不是范围的一部分;这个使其可选,即0或1个破折号。例如,/array\\-?[\d\.]+,\-?[\d\.]+\+\-?[\d\.]+,\-?[\d\.]+\/

您可能还想签出-您可以输入一个正则表达式和一组字符串,它将突出显示匹配/不匹配的内容。您需要排除分隔符/或^


请注意,这是一个有点快和松散;它也将匹配数组5,0+0,1。。。。。。。。。。。。例如,您可以使用\-?\d*.\d+\而不是\-?[\d\.]+\来表示数字,从而将其更加精确;将匹配0或1个文字-后跟0或多个数字,后跟一个文字点,后跟1或多个数字。

这是我制作的正则表达式:

array\((-*\d+\.\d+),(-*\d+\.\d+)\+(-*\d+\.\d+),(-*\d+\.\d+)\)
这也会将四个数字分成几组,这样您就可以得到单独的数字

你会注意到重复的模式

(-*\d+\.\d+)
说明:

-* means 0 or more matches of the - sign ( so - sign is optional)
\d+ means 1 or more matches of a number
\. means a literal period (decimal)
\d+ means 1 or more matches of a number

整件事都用括号括起来,让它成为一个被俘虏的群体。

哇。太过分了。只有一个字符(如a)表示它自己。如果需要表示多个字符,则只需要方括号中的字符类字符。所以数组与正则表达式中的[a]{1}[r]{2}[a]{1}[y]{1}相同。您能提供一个您试图匹配的实际输入列表吗?我不确定lat和lng应该采用什么格式。为什么文本是一个blob,为什么不单独存储它们?@Dagon因为有些路径可能非常长,因为它们是在谷歌地图上画线的代码,有时在世界的另一端有不同的方式在mysql中存储地理数据,如地理空间类型或geoJSON,我想不出比你的格式更不合适的了。此外:两个lat/lng对也是一条路径,这一区别的目的是什么?谢谢!使用最后一个,它仍然无法工作,因为php preg_match需要^分隔符,因为这是第一个分隔符?啊,它是分隔符。通常用于那个。我忘记了分隔符。