我有一个正常运行的RegEx,用于列出在给定html内容中找到的所有链接
<a\s[^>]*href=(\"??)(http[^\" >]*?)\\1[^>]*>(.*)<\/a>
这实际上工作得很好,现在的问题是我想从结果中排除所有内部链接(乍一看,仅获取包括“ http”在内的链接就足够了,但不幸的是,内部的“绝对”链接。.
鉴于我知道网站的网址,因此不需要帮助,所以我们假设是www.test.com / test.com
我看过Negative Lookahead参考,但是我不确定应如何在现有RegEx中实现它。
谢谢 干杯
答案 0 :(得分:1)
最简单的方法是使用轮换方式创建网站的黑名单
与(*SKIP)(*FAIL)
结合使用。
这样,引擎就可以越过令人讨厌的网址,并且无法回溯。
(?:<a(?=\s)(?=(?:[^>"']|"[^"]*"|'[^']*')*?\shref\s*=\s*(?:(['"])(?:(?!\1)[\S\s])*?(?:www\.test\.com|test\.com)(?:(?!\1)[\S\s])*?\1))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>.*?</a\s*>(*SKIP)(*FAIL)|<a(?=\s)(?=(?:[^>"']|"[^"]*"|'[^']*')*?\shref\s*=\s*(?:(['"])([\S\s]*?)\2))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>(.*?)</a\s*>)
https://regex101.com/r/hpwUr3/1
您想要的东西是:
-组3 =网址
-第4组=内容
解释
(?:
# Begin Offender Anchor tag
< a
(?= \s )
(?= # Asserttion for: href (a pseudo atomic group)
(?: [^>"'] | " [^"]* " | ' [^']* ' )*?
\s href \s* = \s*
(?:
( ['"] ) # (1)
(?:
(?! \1 )
[\S\s]
)*?
(?: # Add more offenders here
www \. test \. com
| test \. com
)
(?:
(?! \1 )
[\S\s]
)*?
\1
)
)
# Have the href offendeer, just match the rest of tag
\s+
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
> # End tag
.*?
</a \s* >
(*SKIP) (*FAIL) # Move past the offender
|
# Begin Good Anchor tag
< a
(?= \s )
(?= # Asserttion for: href (a pseudo atomic group)
(?: [^>"'] | " [^"]* " | ' [^']* ' )*?
\s href \s* = \s*
(?:
( ['"] ) # (2)
( [\S\s]*? ) # (3), Good link
\2
)
)
# Have the href good one, just match the rest of tag
\s+
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
> # End tag
( .*? ) # (4), Content
</a \s* >
)