正则表达式排除title属性中的匹配项

时间:2014-04-09 19:58:25

标签: php regex html-parsing

我希望在页面中找到所有费用代码。代码为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。

有什么建议吗?非常感谢。

2 个答案:

答案 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]);

参考