如何在PHP/WordPress中从URL解析yyyy-mm-dd格式的日期?
从带日期的URL中提取日期(PHP及WordPress场景)
嘿,我来帮你搞定这个问题!要从http://example.com/nepal/events/visit-nepal-2020/2020-01-09这种格式的URL里提取yyyy-mm-dd格式的日期,不管是普通PHP环境还是WordPress场景,都有几种靠谱的方法,我给你详细拆解:
一、普通PHP环境下的提取方法
方法1:拆分URL路径(适合日期在末尾的场景)
你的日期刚好在URL路径的最后一段,这种情况直接拆分路径就能拿到,步骤很清晰:
$url = 'http://example.com/nepal/events/visit-nepal-2020/2020-01-09'; // 解析URL,只取出路径部分 $path = parse_url($url, PHP_URL_PATH); // 去掉路径首尾的斜杠,再按斜杠分割成数组 $pathSegments = explode('/', trim($path, '/')); // 取数组最后一个元素就是日期 $date = end($pathSegments); // 推荐:验证日期格式是否有效(避免拿到无效日期比如2020-13-01) if (DateTime::createFromFormat('Y-m-d', $date) !== false) { echo "提取到的日期:{$date}"; } else { echo "URL中的日期格式不符合要求"; }
方法2:正则表达式(适合日期位置不固定的场景)
如果日期可能出现在URL的任意位置,用正则匹配yyyy-mm-dd的通用格式更灵活:
$url = 'http://example.com/nepal/events/visit-nepal-2020/2020-01-09'; // 匹配yyyy-mm-dd格式的正则表达式 $datePattern = '/\b\d{4}-\d{2}-\d{2}\b/'; if (preg_match($datePattern, $url, $matches)) { $date = $matches[0]; echo "提取到的日期:{$date}"; } else { echo "未在URL中找到符合格式的日期"; }
二、WordPress场景下的优化方法
WordPress有自己的URL重写和查询变量机制,我们可以利用这些特性让日期提取更优雅,也更符合WordPress的开发规范:
方法1:通过自定义查询变量提取(推荐)
如果这个URL是WordPress的自定义文章类型(比如活动event),可以先注册查询变量并配置重写规则:
- 在主题的
functions.php中添加以下代码,注册查询变量并设置重写规则:
// 注册自定义查询变量 function register_event_date_var($vars) { $vars[] = 'event_date'; return $vars; } add_filter('query_vars', 'register_event_date_var'); // 添加重写规则,把URL中的日期映射到查询变量 function add_event_rewrite_rule() { add_rewrite_rule( 'nepal/events/([^/]+)/(\d{4}-\d{2}-\d{2})/?', 'index.php?post_type=event&name=$matches[1]&event_date=$matches[2]', 'top' ); } add_action('init', 'add_event_rewrite_rule');
保存完代码后,一定要去WordPress后台的「设置→固定链接」页面点击「保存更改」,刷新重写规则。
在对应的模板文件(比如
single-event.php)中,直接通过get_query_var()获取日期:
$eventDate = get_query_var('event_date'); // 同样建议验证日期有效性 if ($eventDate && DateTime::createFromFormat('Y-m-d', $eventDate)) { echo "活动日期:{$eventDate}"; }
方法2:结合WordPress函数+普通PHP方法
如果不想配置重写规则,也可以先获取当前页面的URL,再用普通PHP的方法提取:
// 获取当前页面的URL $currentUrl = get_permalink(); // 用正则提取日期(和普通PHP方法一致) $datePattern = '/\b\d{4}-\d{2}-\d{2}\b/'; if (preg_match($datePattern, $currentUrl, $matches)) { $date = $matches[0]; // 后续业务处理 }
注意事项
- 不管用哪种方法,都建议添加日期格式验证,避免提取到无效的日期字符串;
- WordPress中修改重写规则后,必须刷新固定链接才能生效,否则新规则不会被识别。
内容的提问来源于stack exchange,提问作者dbp
相关产品推荐
相关产品推荐

