PHP正则表达式异常行为

PHP正则表达式异常行为,php,regex,Php,Regex,我正在开发一个简单的正则表达式来解析URL的一部分,正则表达式必须能够在一个命名组中捕获URL的一部分,只有几个允许的字符(a-z0-9和-),如果存在其他字符,则对于给定的字符串,正则表达式必须失败,并且不会进行捕获 但正如您在屏幕截图上看到的,当regexp找到一个%符号时,它停止,并捕获它前面的部分(如果它超过两个字符),结果是相同的,没有单词边界(\b) 我无法理解为什么%的行为类似于\n并且引擎正在捕获以前的字符,并且停止%不在允许的字符列表中,因此该字符串应该失败。。。还是不 我也尝

我正在开发一个简单的正则表达式来解析URL的一部分,正则表达式必须能够在一个命名组中捕获URL的一部分,只有几个允许的字符(a-z0-9和-),如果存在其他字符,则对于给定的字符串,正则表达式必须失败,并且不会进行捕获

但正如您在屏幕截图上看到的,当regexp找到一个%符号时,它停止,并捕获它前面的部分(如果它超过两个字符),结果是相同的,没有单词边界(\b)

我无法理解为什么%的行为类似于\n并且引擎正在捕获以前的字符,并且停止%不在允许的字符列表中,因此该字符串应该失败。。。还是不

我也尝试了实际的PHP代码,得到了非常相同的结果

编辑1:

实际PHP代码:

if (preg_match('/fixed_url_part/\b(?P<codename>[a-z0-9-]{2,})\b', $url, $regs)) {
    return $regs['codename'];
}
if(preg_match('/fixed_url_part/\b(?P[a-z0-9-]{2,})\b',$url,$regs)){
返回$regs['codename'];
}

您没有告诉它匹配整行。添加
$
使其与结尾匹配

^/fixed_url_part/\b(?P<codename>[a-z0-9\-]{2,})\b$
^-- match start of line                          ^-- match end of line
^/fixed\u url\u part/\b(?P[a-z0-9\-]{2,})\b$
^--匹配行的开头^--匹配行的结尾

问题中的确切代码将非常有用。看起来您的占位符只是查找字母数字字符,而不包括
%
。我用代码编辑了答案,但问题是,为什么它用%捕获以前的字符,而在字符串上用u,它失败了?为什么不使用%?如果没有结束锚(正如@Halcyon所指出的),您的模式只匹配“直到”它找不到更多匹配的字符。当遇到
%
时,单词
\b
边界是正确的。谢谢@mario,我不知道%是一个单词boundarykeep
-
,也是OP想要的。我还要加上
^
,以防万一。(我想,
abc/fixed\u url\u part/def
应该失败。)使用字符串结尾锚($)可以很好地工作,但我想知道的是,为什么字符串中的%是它的regexp捕获部分,而它应该失败(如果字符是u而不是%),我想这是因为
\b
(单词边界)
%
被视为单词边界,而
\
则不是。因此,
%
触发导致匹配的
\b