2014-04-09 14 views
-1

我正在使用一些数据,为谷歌地图提供路径作为路径或一组两个纬度和经度。我将这两个值都作为BLOB存储在mySql数据库中,但我需要检测结果中出现的不是路径的值。在试图做到这一点,我在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个位数由小数点follwed和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

哇。矫枉过正。只有一个字符如“a”代表它自己。如果您需要表示多个字符,则只需要字符类(方括号内的字符)。因此'array'与正则表达式中的[a] {1} [r] {2} [a] {1} [y] {1}'相同。 –

+0

您能否提供您尝试匹配的实际输入列表?我不确定'lat'和'lng'应该是什么格式。 – CAustin

+0

为什么文本是一个blob,你为什么不单独存储它们? –

回答

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 

整个事情是包裹在方括号,使其捕获的组。

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\.\,\+]+)\)/ - 然后您需要先拆分它们+,然后,或者,如果确切有两个经纬度对,您可能需要:/array\(([\d\.]+),([\d\.]+)\+([\d\.]+),([\d\.]+)\)/ - 这将返回4个值,每个数字一个;其他的东西(+,,)已被删除,因为它不在(非转义)括号()

编辑:如果你想负拉脱维亚和多头(你为什么不会?),你将需要\-?(“文字 - ”,而不是范围的一部分)在适当的地方; ?使其成为可选的(即0或1破折号)。例如,/array\((\-?[\d\.]+),(\-?[\d\.]+)\+(\-?[\d\.]+),(\-?[\d\.]+)\)/

您可能还想查看http://regexpal.com - 您可以输入正则表达式和一组字符串,并且会突出显示匹配/不匹配的内容。您需要排除分隔符/^

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

+0

感谢您的支持!使用最后一个,它仍然不会工作,因为这是第一个分隔符,php preg_match期望^分隔符? –

+0

啊,它是分隔符。通常用'/'来表示。我忘记了分隔符。 –