PHP preg_match - 这个RegEx有什么问题?

时间:2009-09-25 19:24:45

标签: php regex arrays preg-match

这些值将采用123-123-123-12345格式,我希望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 $

他们都失败了Boo Hoo;(

编辑:

var_dump($elem)

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

5 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分: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个字节......我得到的最接近的是UTF-16,但只有34个字节。那么你使用的编码是什么?

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

答案 2 :(得分:0)

使用双反斜杠。 \

答案 3 :(得分:0)

... Ummmmmm

在您的编辑中,您正在谈论 $ array ,并在您的循环中讨论 $ elem

这可能是问题吗?

编辑:顺便说一句,你的数据有些奇怪,我只计算17个字符,为什么要给出一个字符串(36)?

答案 4 :(得分:0)

无法复制。将代码粘贴到文件中时,代码可以正常工作。

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