求适配两种文件名的正则表达式(用于.htaccess的mod-rewrite)
解决方案
正则表达式
使用以下正则可同时兼容两种场景:
^([-A-Za-z0-9\+\.]+)(?:-(20\d{2}))?$
正则说明
^和$:锚定整个字符串,避免出现部分匹配的情况([-A-Za-z0-9\+\.]+):捕获组$1,匹配文件名的主体部分,包含你指定的所有允许字符(?:-(20\d{2}))?:?:标记非捕获组,仅用于包裹规则,不会生成额外捕获变量-(20\d{2}):匹配连接年份的横杠,以及20开头的四位数年份(如2019、2024),年份部分会被捕获到$2?:让整个年份后缀部分变为可选,不带年份的文件名也能正常匹配
.htaccess 规则示例
将正则写入RewriteRule,示例如下:
RewriteEngine On RewriteRule ^([-A-Za-z0-9\+\.]+)(?:-(20\d{2}))?$ target-script.php?item=$1&year=$2 [L]
测试效果
- 文件名
car-audi-tt-2:$1 = car-audi-tt-2,$2为空 - 文件名
car-audi-tt-2-2019:$1 = car-audi-tt-2,$2 = 2019
原正则的问题分析
你之前的正则([-A-Za-z0-9\+\.]+)-(20[-0-9]{2})*存在两处问题:
- 强制要求字符串末尾带一个横杠(即使无年份),导致不带年份的文件名无法匹配
*允许出现多个年份后缀(如car-audi-tt-2-2019-2020),不符合常规需求
内容的提问来源于stack exchange,提问作者mdromed
相关产品推荐
相关产品推荐

