两个纬度和经度的正则表达式不起作用

时间:2014-04-09 00:01:35

标签: php mysql regex google-maps preg-match

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

  

阵列(纬度,经度+纬度,经度)

我正在使用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}^

正规则有时让我感到困惑(正如现在所做的那样)。任何人都可以帮助我吗?

修改

lat可以是2位数,后跟小数点和8位数,lng可以是3位数,可以是3位数,后跟小数点和8位数。两者都可以是正面的或负面的。

以下是一些示例lat lngs:

  

51.51160000,-0.12766000

     

-53.36442000,132.27519000

     

51.50628000,0.12699000

     

-51.50628000,-0.12699000

所以完全匹配看起来像:

  

阵列(51.51160000,-0.12766000 + -53.36442000,132.27519000)

进一步修改

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

2 个答案:

答案 0 :(得分:2)

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

如果您对某个角色有一种可能性,例如,数组中的a,您确实可以将其写为[a];但是,您也可以将其写为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

您使用^作为分隔符 - 通常是/;我起初并没有认出来。我不确定你可以使用哪个分隔符,所以,为了以防万一,我会将其更改为通常的/。这使得上面的正则表达式/array\([\d\.\,\+]{1*}\)/

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

然后,收集结果数字(假设您只需要括号之间的部分,将其放入(非转义)括号中,因此:/array\(([\d\.\,\+]+)\)/ - 然后您需要将它们拆分,首先是{ {1}},然后按+。或者,如果恰好有两个lat,lng对,您可能需要:, - 这将返回4个值,每个数字一个;附加内容( /array\(([\d\.]+),([\d\.]+)\+([\d\.]+),([\d\.]+)\)/+)已被移除,因为它不在(非转义)括号,中。

编辑:如果你想要负面的拉特和多头(你为什么不呢?)你需要()(一个“文字 - ”,而不是一个范围的一部分)在适当的地方; \-?使其成为可选项(即0或1个破折号)。例如,?

您可能还想查看http://regexpal.com - 您可以输入正则表达式和一组字符串,它会突出显示匹配/不匹配的内容。您需要排除分隔符/array\((\-?[\d\.]+),(\-?[\d\.]+)\+(\-?[\d\.]+),(\-?[\d\.]+)\)//

请注意,这有点快而且松散;它也会匹配^。您可以将其更多地指出来,例如,使用array(5,0+0,1...........)而不是(\-?\d*\.\d+)\)作为数字;将匹配(0或1个文字(\-?[\d\.]+)\))后跟(0或更多数字)后跟(正好一个文字点)后跟(1个或更多个数字)。

答案 1 :(得分: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

整个事情用括号括起来,使其成为一个被捕获的群体。