[英]PHP preg_match - what's wrong with this RegEx?
值將采用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" }
試試這個代碼:
$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);
可能有用,檢查它是否確實包含您所期望的?
您能否提供一些測試數組的數據(最好是序列化的),因為我無法重現此行為。
$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
同樣,在正則表達式中不需要反斜杠。 如果破折號不是第一個字符,則只需要在[]組中進行轉義([-az]會匹配“-OR az”,但是[az]會匹配“ a或\\或z”)。
-編輯-
好的,我唯一不了解的是您使用的是哪種編碼?
string(36) "123-123-123-12345"
36個字節...最接近的是UTF-16,但只有34個字節。 那么,您使用的編碼是什么?
您還可以嘗試在與regexp匹配之前將字符串轉換為utf-8。 (在轉換為utf-8后,也請嘗試在正則表達式中使用'u'參數:'/ somreg \\ d / u')
使用雙反斜杠。 \\
Ummmmmm ....
在您的編輯中,您談論的是$ array,而在您的循環中談論的是$ elem 。
這可能是問題嗎?
編輯:順便說一下,您的數據有些奇怪,我只計算17個字符,所以為什么要給出一個字符串(36)?
無法復制。 當我將其粘貼到文件中時,您的代碼可以正常工作。
但是,由於var_dump()
顯示的目標字符串為15個字符的字符串,目標字符串為35個字節,因此似乎確實存在編碼問題。 如果對utf8_decode($value)
而不是$value
運行正則表達式會怎樣?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.