2012-02-09 143 views
0

我仍然得到我的頭輪正則表達式和學習一點一點。這個讓我頭疼。我有類似下面的字符串:PHP preg_replace - 正則表達式

".......mapsearch"), '52.486683, -4.044363', options......" 

我想從字符串檢索2號(長& LAT) - 如果我一起找回它們作爲單個字符串完成與逗號我不介意和中間的空間。

我知道我想使用表達式來匹配並忽略從開始到包括mapsearch"), '的任何內容,並且對於字符串末尾的', options模式也是如此。

UPDATE

該字符串也將包含一系列其它字符,如{}()=:/和數字之前和所需的匹配後..

+0

爲什麼不爆炸就',',然後循環並檢查它是否是一個浮點/ INT保留它? – MetalFrog 2012-02-09 16:47:29

+0

這些是唯一存在於字符串中的2個數字嗎? – ThinkingMonkey 2012-02-09 16:50:01

+0

這是一個來自CSV文件的行嗎?你最好使用解析器。 – Qtax 2012-02-09 16:50:15

回答

3

這將工作,醜如它是:

/mapsearch\"\), '(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)', options/ 

這些數字可以是負數或正數,也可以匹配整數和小數值。該模式將作爲一個單獨的組返回兩個數字。

+2

'( - ?\ d +(?:。\ d +)?)'是如何工作的:' - ?'尋找一個可選的前導負號,後跟一定數量的數字('\ d +')。在最初的一組數字之後,我們想匹配一個小數和一些數字('(?:。\ d +)?'),但我們不希望它成爲它自己的捕獲組('?:') 。 – 2012-02-09 16:52:54

+0

返回一個包含3個項目的數組 - 其中第一個是第二個,第二個和第三個返回每個變量 - 儘管如此。謝謝。 – digout 2012-02-09 17:11:03

+0

preg_match(以及我見過的大多數其他正則表達式匹配器)將始終返回完整匹配作爲第一個組。這就是爲什麼有3個項目。 – 2012-02-09 17:39:29

0

在這種情況下,我會使用metalfrog的解決方案進行一些更改。

如果你確定只有字符串有逗號,沒有別的,然後爆炸,並檢查它是否是一個整數/浮點數或者如果你知道它是第n個項目,只需要$ array [$ n] 。

否則爆炸並使用this(需要一些編輯)來確定它是否是座標。

0

假設它是唯一的號碼單引號:

'-?\d+.\d+, -?\d+.\d+' 
1
preg_match("/'([^,]+), ([^']+)'/", $string, $matches); 
echo $matches[0]; // 52.486683 
echo $matches[1]; // -4.044363 
0

你可以試試這個:

(\-?[0-9]+\.[0-9]+\,\ \-?[0-9]+\.[0-9]+) 

提取

52.486683,-4.044363

0
$subject = ".....mapsearch\"), '52.486683, -4.044363', options......"; 
$regex = '/mapsearch\"\), \'(-?[0-9]{1,3}\.[0-9]{6}, -?[0-9]{1,3}\.[0-9]{6})\', options/'; 
if (preg_match($regex, $subject, $matches)){ 
    print_r($matches); 

這會給你:

Array 
(
    [0] => mapsearch"), '52.486683, -4.044363', options 
    [1] => 52.486683, -4.044363 
)