从链接RegEx中排除网站网址

时间:2018-12-03 19:22:45

标签: php regex preg-match pcre

我有一个正常运行的RegEx,用于列出在给定html内容中找到的所有链接

<a\s[^>]*href=(\"??)(http[^\" >]*?)\\1[^>]*>(.*)<\/a>

这实际上工作得很好,现在的问题是我想从结果中排除所有内部链接(乍一看,仅获取包括“ http”在内的链接就足够了,但不幸的是,内部的“绝对”链接。.

鉴于我知道网站的网址,因此不需要帮助,所以我们假设是www.test.com / test.com

我看过Negative Lookahead参考,但是我不确定应如何在现有RegEx中实现它。

谢谢 干杯

1 个答案:

答案 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* >
 )