2012-02-09 104 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 
)