Исключить URL сайта из ссылок RegEx - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть работающий RegEx, который я использую, чтобы перечислить все ссылки, найденные в данном HTML-контенте

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

Это на самом деле работает довольно хорошо, проблема сейчас в том, что я хочу исключить из результатов все внутренние ссылки (на первый взгляд этого будет достаточно, чтобы получить тольковключая «http», но, к сожалению, множество внутренних «абсолютных» ссылок.test.com / test.com

Я посмотрел ссылку на Negative Lookahead, но я не уверен, как она должна быть реализована в существующем RegEx ..

Спасибо Cheers

1 Ответ

0 голосов
/ 03 декабря 2018

Самый простой способ - создать черный список сайтов, используя чередование
в сочетании с (*SKIP)(*FAIL).
. Таким образом, движок переходит мимо URL-адресов с ошибками и не может вернуться назад.

(?:<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 = URL
- группа 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* >
 )
...