正则表达式不起作用,接受几乎所有字母数字组合

时间:2014-06-24 01:34:13

标签: php regex

有人可以告诉我我做错了什么吗?这是接受一切匹配。

if (preg_match("/^[A-Z][a-z][a-z][0-9]|[1-9][0-9]|1[0-4][0-9]|15[0-1]:[0-9]|[1-9][0-9]|1[0-6][0-9]|17[0-6]/", $_GET['id']))
 {
 echo "match";
 }
 else
 {
 echo "no match";
 }

我希望它只匹配第一个字母是大写字母AZ,第二个字母是小写字母az,第三个字母是小写字母az,然后是1到150之间的数字,冒号:然后是一个介于1和176之间的数字。它应该与Abc150匹配:176 Zyx1:1但不是aBc151:177

2 个答案:

答案 0 :(得分:5)

使用此:

^[A-Z][a-z]{2}(?:[1-9][0-9]?|1[0-4][0-9]|150):(?:[1-9][0-9]?|1[0-6][0-9]|17[0-6])$

请参阅demo

  • ^声称我们位于字符串的开头
  • [A-Z][a-z]{2}匹配一个大写字母和两个小写字母
  • (?:[1-9][0-9]?|1[0-4][0-9]|150)匹配1到150之间的数字
  • :匹配冒号
  • (?:[1-9][0-9]?|1[0-6][0-9]|17[0-6])匹配1到176之间的数字
  • $断言我们在字符串
  • 的末尾

在php中:

$regex = "~^[A-Z][a-z]{2}(?:[1-9][0-9]?|1[0-4][0-9]|150):(?:[1-9][0-9]?|1[0-6][0-9]|17[0-6])$~";
echo (preg_match($regex,$string)) ? "***Match!***" : "No match";

答案 1 :(得分:0)

你需要将表达式放在你的交替运算符(|)的parens中,否则它会左右对齐一切。如你所知,当你的意思是Aaa1或Aaa10时,它与Aaa1或10匹配。尝试:

/^[A-Z][a-z][a-z]([0-9]|[1-9][0-9]|1[0-4][0-9]|15[0-1]):([0-9]|[1-9][0-9]|1[0-6][0-9]|17[0-6])/