我希望在页面中找到所有费用代码。代码为5位数,开头有一个可选的单个字母。我现在有这个,这很有效。
preg_match_all("/\b([a-zA-Z])?\d{5}\b/", $content, $matches);
我的问题是我需要排除链接的'title'属性中出现的任何内容。
<a href="#" title="Sample Fee – also see B11023">G14015</a>
我希望匹配G14015,但不匹配B11023。
有什么建议吗?非常感谢。
答案 0 :(得分:0)
根据您的评论,澄清费用代码从不在标签中找到,我建议采用双通解决方案。首先,通过用一个空格替换它们来删除所有标签。然后处理以查找费用代码。
$content = preg_replace("/<[^>]+>/", " ", $content);
preg_match_all("/\b[A-Za-z]\d{5}\b/", $content, $matches);
这假定不存在迷路<
或>
。
当然,适用 one should not use regex to parse html or xml 的通常警告。
答案 1 :(得分:0)
PHP有(*跳过)(*失败)魔术
重新提出这个问题,因为它有一个简单的解决方案,没有提到。此问题是此问题中解释为"regex-match a pattern, excluding..."
的技术的典型案例关于使用正则表达式解析html的所有警告,这是一个简单的方法。
我们可以用一个简单的正则表达式来解决它:
(?i)<[^>]+(*SKIP)(*F)|[a-z]?\d{5}
请参阅demo。
交替|
的左侧匹配完成<tags>
然后故意失败,之后引擎跳到字符串中的下一个位置。右侧与您想要的模式匹配,我们知道它们是正确的,因为它们与左侧的表达式不匹配。
示例代码
$regex = '~(?i)<[^>]+(*SKIP)(*F)|[a-z]?\d{5}~';
preg_match_all($regex, $yourstring, $matches);
print_r($matches[0]);
参考