如何结合正则与XPath evaluate方法查询ID前缀匹配的所有XML条目
问题原因
你之前的写法不生效核心有两个问题:
- XPath的
=是等值比较运算符,不是正则匹配符,你把正则表达式拼接成字符串后,相当于在查找id值完全等于41:/[0-9]{4}-[0-9]{2}-[0-9]{2}/这个字面量的节点,自然匹配不到结果。 - PHP默认使用的是XPath 1.0版本,没有内置正则匹配函数,不能直接在XPath语句中写正则做匹配。
解决方案
方案1:前缀匹配(最简实现,满足大部分场景)
如果你不需要严格校验后缀的日期格式,只需要匹配id前缀为[输入ID]:的节点,直接用XPath 1.0内置的starts-with函数即可:
if ($xpath->evaluate("count(self::*[starts-with(id, '$trainId:')]) > 0", $item)) { // 匹配成功后的业务逻辑 }
方案2:严格校验日期格式
如果需要确保后缀是合法的YYYY-MM-DD格式,可以先取出id值再用PHP正则判断:
// 先获取当前item节点的id文本值 $currentId = $xpath->evaluate('string(id)', $item); // 正则匹配前缀+日期格式,注意用preg_quote转义输入的trainId避免正则注入 if (preg_match('/^' . preg_quote($trainId, '/') . ':[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $currentId)) { // 匹配成功后的业务逻辑 }
内容的提问来源于stack exchange,提问作者srd
相关产品推荐
相关产品推荐

