2009-09-25 273 views
0

这些值的格式为123-123-123-12345,我希望preg_match能够工作。你能看到这个regEx有什么问题吗?PHP preg_match - 此RegEx有什么问题?

foreach($elem as $key=>$value) { 

    // Have tried this With and without the + before the $ as well 
    if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) { 
     echo "Yeah match Elm: ".$value."<br />"; 
    } else { 
     echo "Boo Hoo Elm: '".$value."'<br />"; 
    } 
} 

也试过

/^\d{3}\-\d{3}\-\d{3}\-\d{5}+$/ 

      //With and without the + before the $ 

他们都失败,嘘呼;(

编辑:

var_dump($elem) 

array(3) { [0]=> string(1) "c" [1]=> string(0) "" [2]=> string(36) "123-123-123-12345" } 
+0

在这种情况下,您不需要转义破折号。 – Gumbo 2009-09-25 19:31:16

+0

** + **似乎没有做任何事情,它可以在没有它的情况下工作,并且在最后以10位数字失败。 – jeroen 2009-09-25 20:04:45

+1

顺便说一句,你的数据有些奇怪,我只计算17个字符,为什么要给一个字符串(36)? – jeroen 2009-09-25 20:07:46

回答

1

试图验证码:

$value = '123-123-123-12345'; 

if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) { 
    echo "Yeah match Elm: ".$value."<br />"; 
} else { 
    echo "Boo Hoo Elm: '".$value."'<br />"; 
} 

(不知道\是有用的 - 但他们似乎没有引起任何麻烦,在这种特殊情况下)

我得到:

Yeah match Elm: 123-123-123-12345 

而与此:

$value = '123-123-1a-123'; 

我得到:

Boo Hoo Elm: '123-123-1a-123' 

正则表达式似乎确实对我有用吗?


你能提供更多的代码吗?或者可能使用:

var_dump($elem); 

可能是有用的,以检查它是否确实包含您期望的内容?

+0

嗯,这是我的想法,但由于某种原因,它不工作。来自对象的价值是否重要? – 2009-09-25 19:36:14

+0

不确定你的意思是“来自一个物体”;你能发布我建议的var_dump的输出吗? (你可以编辑你的帖子,为此 - 可能会比在评论中更容易阅读^^) – 2009-09-25 19:38:09

+0

var_dump显示字符串 – 2009-09-25 19:45:24

0

使用双反斜线\

+0

如果我这样做,那也将允许反斜杠 – 2009-09-25 19:27:50

+0

不,这需要在字符串中转义反斜杠字符。要允许在正则表达式中使用反斜杠,你应该使用四个反斜杠) – Anatoliy 2009-09-25 19:30:42

+0

没有代码的工作方式如下所述形成其他人测试它,我以前在其他脚本中使用过它,它不需要双反斜杠来工作。 – 2009-09-25 19:38:49

1

能否请您提供一些测试阵列与数据(序列化将是最好的),因为我不能重现此行为。

$elem = array ('123-123-123-12345'); 

foreach($elem as $key=>$value) { 

    // Have tried this With and without the + before the $ as well 
    if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) { 
     echo "Yeah match Elm: ".$value."<br />"; 
    } else { 
     echo "Boo Hoo Elm: '".$value."'<br />"; 
    } 
} 

结果: 呀匹配榆树:123-123-123-12345

而且不需要在正则表达式的反斜杠。如果它们不是第一个字符([-a-z]将匹配“ - 或a-z”,但[a-z]匹配“a或\或z”),则只需在[]组中跳过破折号。

---编辑---

好了,那是什么编码您使用的是我无法理解的嘛?

string(36) "123-123-123-12345" 

36 bytes ...我得到的最接近的是UTF-16,但只有34个字节。那么你使用的编码是什么?

您也可以尝试在与正则表达式匹配之前将字符串转换为utf-8。(也可尝试使用 'U' 参数的正则表达式: '/ somreg \ d/U',转换为UTF-8之后)

+0

我认为短划线或连字符会导致正则表达式认为它是一些东西,这就是为什么我逃脱了它。 – 2009-09-25 19:46:18

+0

另一件事,如果值来自SimpleXMLElement对象,它会影响吗? – 2009-09-25 20:01:30

+0

可能的话,检查源代码的编码,以防万一尝试转换为UTF-8,因为我不确定SimpleXMLElement如何处理文档的编码。我玩了一下,但只有utf-8编码的xml文件,并没有问题。 – bisko 2009-09-25 20:06:27

0

Ummmmmm ....

在你编辑你正在谈论$ array并在您的循环中约$ elem

这可能是问题吗?

编辑︰顺便说一句,有一些奇怪的数据,我只有17个字符,所以为什么是给一个字符串(36)?

+0

sry这只是一个错字。它们在代码中是一样的,会在问题中改变这一点。日Thnx – 2009-09-25 20:03:33

0

无法复制。当我把它粘贴到文件中时,你的代码工作正常。

由于您的var_dump()显示您的目标字符串为15个字符的字符串为35个字节,但它看起来好像您有编码问题。如果对utf8_decode($value)而不是$value运行正则表达式,会发生什么情况?