2009-09-25 276 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運行正則表達式,會發生什麼情況?