PHP:Preg_match在“have”时不起作用/&引用;

PHP:Preg_match在“have”时不起作用/&引用;,php,regex,preg-replace,preg-match,Php,Regex,Preg Replace,Preg Match,这件事真让我难受: echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'downcom'); 这一个打印0,因为它错了 echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'down.com'); 这一张打印1,它的权利 我的问题是:为什么这一张仍然打印1 echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'down

这件事真让我难受:

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'downcom');
这一个打印0,因为它错了

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'down.com');
这一张打印1,它的权利

我的问题是:为什么这一张仍然打印1

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'down.c/om');
我想要我的preg_match check域名,仅限domain.com。我不希望人们进入domain.com/asda,但它仍然允许人们进入[a-zA-Z0-9-.]+


谢谢您的帮助。

看起来您只需要添加开始和结束边界
^
$

echo preg_match("/^([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)$/",'down.c/om');
//---------------^^^--------------------------------^^^
// Prints 0

您失败的原因是该模式实际上与字符串
down.c
匹配,但是由于您没有包含字符串的
$
结尾,因此任何附加字符都不需要与regex模式匹配,因此可以忽略
/om
。通过包含
$
,可以强制将测试字符串匹配到其末尾。

让我们分解正则表达式,看看它在做什么:

([a-zA-Z0-9\-\.]+)
第一部分说的是这些字符中的一个或多个,与“down”匹配得很好

\.
然后我们匹配一个点

([a-zA-Z0-9]+)
然后我们匹配这些字符中的一个或多个。“c”满足1或多个规则,因此返回true。如果要精确匹配三个字符,请将正则表达式更改为:

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]{3})/",'down.c/om');
正如您所期望的那样,应该返回false。Michael的定位锚提示(来自他的回答)也很有用,不过您需要确保引入的内容已被修剪(可以与\n匹配,正如我昨天发现的)。您还可以使用
D
修饰符或
\z
断言来确保您位于行的末尾。下面是它组合在一起时的外观:

echo preg_match("/^([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]{3})$/D",'down.c/om');