谁能告诉我我做错了什么?这是接受所有匹配。
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";
}
我希望它只匹配如果第一个字母是大写字母a-z,第二个字母是小写字母a-z,第三个字母是小写字母a-z,然后是1和150之间的数字,冒号:,然后是1和176之间的数字。它应该匹配Abc150:176 Zyx1:1,但不匹配aBc151:177
使用
^[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])$
看演示。
-
^
断言我们位于字符串 的开头。 -
[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的数字 -
$
断言我们位于字符串 的末尾
$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";
您需要将表达式放置在parent中的交替操作符(|)周围,否则它将匹配左侧和右侧的所有内容。就像你现在看到的,当你说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])/