如何编写匹配合法月日的URL正则?适用于.htaccess场景
修正后的.htaccess正则表达式方案
需求回顾
需要匹配以下URL格式,且日期部分(月-日)必须同时存在,月份范围1-12,日期范围1-31:
gallery/a-day-like-todaygallery/a-day-like-today/gallery/a-day-like-today/2-18gallery/a-day-like-today/2-18/
原正则的问题
- 允许日期部分缺失日(
(\d{1,31})?中的?导致日可选),违反“月份和日期必须同时存在”的要求 - 未限制月份(1-12)和日期(1-31)的数值范围,会匹配
13-5、10-32这类无效日期
修正后的RewriteRule
RewriteRule ^gallery/a-day-like-today(?:/(?:0?[1-9]|1[0-2])-(?:0?[1-9]|[12]\d|3[01]))?/?$ gallery/a_day_like_today.php?month=$1&day=$2 [L]
正则拆解
^gallery/a-day-like-today:匹配基础路径开头(?:/(?:0?[1-9]|1[0-2])-(?:0?[1-9]|[12]\d|3[01]))?:可选的日期部分(整个块加?表示可省略)/(?:0?[1-9]|1[0-2]):匹配月份,支持1-9、01-09、10-12-(?:0?[1-9]|[12]\d|3[01]):匹配日期,支持1-9、01-09、10-29、30-31
/?$:匹配末尾可选的斜杠,确保带/和不带/的路径都能匹配
匹配验证
会被匹配的有效路径
gallery/a-day-like-todaygallery/a-day-like-today/gallery/a-day-like-today/2-18gallery/a-day-like-today/2-18/gallery/a-day-like-today/09-08gallery/a-day-like-today/12-31/
不会被匹配的无效路径
gallery/a-day-like-today/13-5(月份超出1-12范围)gallery/a-day-like-today/10-32(日期超出1-31范围)gallery/a-day-like-today/5-(缺失日期部分)gallery/a-day-like-today/-10(缺失月份部分)
可选调整:禁用前导零
如果不需要支持02-18这类带前导零的日期格式,可将正则调整为:
RewriteRule ^gallery/a-day-like-today(?:/(?:[1-9]|1[0-2])-(?:[1-9]|[12]\d|3[01]))?/?$ gallery/a_day_like_today.php?month=$1&day=$2 [L]
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

