2014-04-09 37 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

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