【问题标题】:PHP preg_match - what's wrong with this RegEx?PHP preg_match - 这个正则表达式有什么问题?
【发布时间】:2009-09-25 19:24:45
【问题描述】:

值将采用我希望 preg_match 工作的格式 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 />";  
   }
}

也试过

/^\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" }

【问题讨论】:

  • 在这种情况下,您无需转义破折号。
  • + 似乎什么也没做,不管有没有它,它都可以工作,最后会失败,有 10 位数字。
  • 顺便说一句,您的数据有些奇怪,我只数了 17 个字符,为什么要给出一个字符串 (36)?

标签: php regex arrays preg-match


【解决方案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);

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

【讨论】:

  • 嗯,这就是我的想法,但由于某种原因它不起作用。值是否来自对象有关系吗?
  • 不确定你所说的“来自一个物体”是什么意思;你能发布我建议的 var_dump 的输出吗? (你可以编辑你的帖子,因为这可能比评论更容易阅读^^)
  • hmm 我刚刚注意到字符串的大小不等于正则表达式的大小。它没有显示为空白,因为我进行了修剪并通过在值周围添加一些引号并将其打印到屏幕上进行了检查。
  • 是的,你的 var_dump 的输出很奇怪;对我来说,var_dump('123-123-123-12345');给出 17 个字符的长度 ;-) ;;也许这是您的问题的原因,因为您的正则表达式正在使用 ^ 和 $ ?
  • 另外一件事,如果值来自 SimpleXMLElement 对象,这有关系吗?
【解决方案2】:

您能否提供一些带有数据的测试数组(最好是序列化),因为我无法重现这种行为。

$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] 将匹配“- OR a-z”,但 [a-z] 将匹配“a or \ or z”),则仅需要在 [] 组中转义破折号。

--- 编辑---

好的,所以我唯一不明白的是您使用的是什么编码?

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

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

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

【讨论】:

  • 我认为破折号或连字符会导致正则表达式认为它是一个范围,这就是我逃避它的原因。
  • 另外一件事,如果值来自 SimpleXMLElement 对象,这有关系吗?
  • 可能,检查源的编码,以防万一尝试转换为 UTF-8,因为我不确定 SimpleXMLElement 究竟如何处理文档编码。我玩了一下,但只使用了 utf-8 编码的 xml 文件,没有遇到任何问题。
  • 是的,我使用了来自 SimpleXML 的条形标签,现在它验证得很好。
【解决方案3】:

使用双反斜杠。 \

【讨论】:

  • 如果我这样做了,那也将允许使用反斜杠
  • 不,这需要在字符串中转义反斜杠字符。要在正则表达式中允许反斜杠,你应该使用四个反斜杠)
  • 没有其他人测试过的代码如下所述,我之前在其他脚本中使用过,它不需要双反斜杠即可工作。
  • 实际上你需要的正则表达式可以在没有双反斜杠的情况下正常工作,但是在 php 中正则表达式已经由一个字符串描述,并且要在字符串中使用一个斜杠,你需要输入两个斜杠,如果你想使用两个斜杠在正则表达式中,字符串中需要四个斜杠等。希望,很清楚。
  • 他不想匹配字符串中的任何反斜杠。 -1
【解决方案4】:

嗯嗯……

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

这可能是问题吗?

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

【讨论】:

  • 抱歉,这只是一个错字。它们在代码中是相同的,将在问题中改变这一点。谢谢
【解决方案5】:

无法复制。当我将其粘贴到文件中时,您的代码运行良好。

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

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多