2013-03-14 43 views
2

我已经学会了一些基本的正则表达式来润湿我的脚,但对我来说这仍然有点复杂。我需要一组十进制度(例如)用户输入的坐标:使用正则表达式/ preg_match()来检查一组十进制度的坐标是否有效

$latitude = -42.323432 
$longitude = 176.232123

,并检查它们是否有效使用PHP的preg_match()功能。看起来很简单,但我不能为我的生活编写正则表达式,以确保没有错误的数据通过。我将检查彼此分开的北向和东向,因此preg_match()将使用foreach循环迭代两次。

我想我已经想通了所有必要条件:

  • 第一个字符可以是一个,减,加,或一个数字。缺点和加号是可选的。
  • 小数点前的数字总数可以是1到3,但不是0或大于3.
  • 因此,第二位或第四位必须有一个小数点。 (2.2332,-123.422)
  • 整个字符串中必须有一个小数点,在整个字符串中可以有0个或1个小数点或加号。
  • 我希望在小数点后至少有3位小数的精度。没有最大限制(我会简单地将它自己调整为6 dp)
  • 如果除了数字,小数点和可选的正负号之外还有任何字符,请拒绝它。

在此之后,我卡住了!任何帮助,将不胜感激编写正则表达式。谢谢...

+0

显示您的正则表达式到现在为止。 – 2013-03-14 07:42:44

+0

我......我没有。这就是我问的原因。 – ReactingToAngularVues 2013-03-14 07:44:48

+1

你可以去[is_numeric](http://php.net/is_numeric) – Dale 2013-03-14 07:45:01

回答

6

让我们来刺吧:

/^[+\-]?[0-9]{1,3}\.[0-9]{3,}\z/ 

拆毁了

^    - start of string 
    [+\-]?   - zero or one from set of `+` and `-` 
    [0-9]{1,3}  - 1 to 3 digits 
    \.    - decimal point 
    [0-9]{3,}   - 3 or more digits 
    \z    - end of string 

(注意,这是未经测试;))

+0

我也设法写了类似的东西......但后来我想知道如果我在字符串的开始或结尾附加一个字母会发生什么?即z-122.32344zz? 'preg_match()'没有工作在'preg_match(needle,haystack);'?所以我的例子会被认为是好的,即使它真的不是? – ReactingToAngularVues 2013-03-14 07:51:46

+0

@Antilogical,你应该用'^'和'\ z'来表达这个表达式。例如:'/^[+ - ]?\ d {1,3} \。\ d {3,} \ z /' – Qtax 2013-03-14 07:54:16

+0

@Antilogical添加了'^'和'$'作为字符串的开头和结尾。 – 2013-03-14 07:56:54