0

我正在尝试构建一个正则表达式以从内容中删除链接,除非它包含 2 个条件中的 1 个。

<a.*?href=[""'](http[s]?:\/\/(.*?)\.link\.com)?\/(?!m\/).*?<\/a>

这将匹配到在域部分末尾没有 m/ 的任何指向 link.com 的链接。我想稍微改变一下,所以它不匹配链接到 pdf 文件的 URL,不管 url 中有 m/,我想出了:

<a.*?href=["'](http[s]?:\/\/(.*?)\.brodies\.com)?\/(?!m\/).*?\.(?!pdf)["'].*?<\/a>

哦,非常接近,除了现在它只有在 URL 有一个“。”时才会匹配。最后 - 我可以看到它为什么这样做。我似乎无法使“。” 可选,因为这会导致“。”之前的非贪婪模式。继续前进,直到它击中 ["']

任何帮助都会很好地帮助解决这个问题。

谢谢保罗

4

2 回答 2

1

您可能想使用(?<!\.pdf)["']而不是\.(?!pdf)["'].

但请注意,此表达式有几个问题,解决它们的最佳方法是使用适当的 HTML 解析器。

于 2012-05-31T17:40:20.950 回答
1

首先,RegEx 匹配除了 XHTML 自包含标签之外的开放标签

就是说,(因为它可能不会阻止)这是您尝试做的稍微更好的约束版本,但需要注意的是这仍然不够好!

<a[^>]+?href\s*=\s*["'](https?:\/\/[^"']*?\.link\.com)?\/(?!m\/)[^"']*?\.(?!pdf)[^"']*?["'][^>]*?>.*?<\/a>

您可以在以下网址查看此正则表达式的运行示例:http ://rubular.com/r/obkKrKpB8B 。

您的问题实际上只是您在点之后立即寻找引号字符,这里:.(?!pdf)["']

于 2012-05-31T17:54:38.443 回答