PHP的preg_match - 有什么不对的正则表达式?
-
18-09-2019 - |
题
值将是在我想的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 $
它们都失败,嘘呼;(
编辑:
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
而且不需要在正则表达式的反斜杠。破折号只需要在[]组进行转义,如果他们不是第一个字符([-a-Z]将匹配“ - 或A-Z”,而[A-Z]将匹配“一个或\ Z”)。
<强> --- --- EDIT 强>
好了,让我无法理解的唯一的事情是什么编码您使用的?
string(36) "123-123-123-12345"
36个字节...我得到最接近的是UTF-16,但只得到34个字节。那么,什么是您所使用的编码?
您也可以尝试用正则表达式匹配之前的字符串转换为UTF-8。 (也尝试使用 'U' 参数在正规表达式: '/ somreg \ d / U',转换为UTF-8之后)
使用双反斜杠。 \
... Ummmmmm
在你的编辑你正在谈论的 $阵列,并在约循环的 $ ELEM
莫非是问题?
编辑:顺便说一句,有什么奇怪的与您的数据,我只算17个字符那么,为什么是给一个字符串(36)
无法复制。当我把它粘贴到文件中您的代码工作正常。
由于您的var_dump()
显示你的目标字符串是15个字符的字符串35个字节,但是,它似乎像你有编码问题。如果您运行对utf8_decode($value)
代替$value
正则表达式,会发生什么?