Регулярное выражение для соответствия местным ссылкам уценки

1

Я пытаюсь создать регулярное выражение, которое будет соответствовать URL-адресам уценки, но игнорировать контент, который приходит до и после него. Он должен соответствовать только локальным URL-адресам, указывающим на локальные файлы, и игнорировать те, которые указывают на внешние веб-сайты. Пример:

"dddd [link which should be ignore](http://google.com/) lorem ipsum lorem ips sum loreerm [link which shouldn't be ignored](../../../filepath/folder/some-other-folder/another-folder/one-last-folder/file-example.html). lorem ipsum lorem"

Должен соответствовать только второй ссылке. В настоящее время он соответствует всем. Мое регулярное выражение работает для того, что мне нужно, но это, по-видимому, основной случай, который я нашел.

Что я до сих пор:

/(!?\[.*?\]\((?!.*?http)(?!.*?www\.)(?!.*?#)(?!.*?\.com)(?!.*?\.net)(?!.*?\.info)(?!.*?\.org).*?\))/g

В настоящее время это игнорирует первое соединение и соответствует второй ссылке, если вторая ссылка не приходит после первой ссылки. В противном случае это соответствует всем, от первого до второго.

Я использую JavaScript, который не поддерживает отрицательные lookbehinds. Какие-либо предложения?

Теги:

2 ответа

1
Лучший ответ

Есть две проблемы.

  1. Это \[.*?\] Будет [link which should be ignore](http://google.com/) lorem ipsum lorem ips sum loreerm [link which shouldn't be ignored] ] и сопоставить [link which should be ignore](http://google.com/) lorem ipsum lorem ips sum loreerm [link which shouldn't be ignored] так что это будет соответствуют утверждениям.
  2. Утверждения неограничены.

Вы можете исправить 1 и 2 с этим регулярным выражением

((!?\[[^\]]*?\])\((?:(?!http|www\.|\#|\.com|\.net|\.info|\.org).)*?\))

расширенный

 (                             # (1 start)
      ( !?\[ [^\]]*? \] )           # (2), Link
      \(                            # Open paren (
      (?:                           # Cluster
           (?!                           # Not any of these
                http
             |  www\.
             |  \# 
             |  \.com 
             |  \.net 
             |  \.info 
             |  \.org 
           )
           .                             # Ok, grab this character 
      )*?                           # End cluster, do 0 to many times
      \)                            # Close paren )
 )                             # (1 end)

метрика

----------------------------------
 * Format Metrics
----------------------------------
Cluster Groups      =   1

Capture Groups      =   2

Assertions          =   1
       ( ? !        =   1

Free Comments       =   7
Character Classes   =   1
  • 1
    Это решает мою проблему, спасибо за ответ и объяснение!
1

Тестирование, если URL-адрес является локальным или внешним, не является заданием для регулярного выражения. Как вы можете видеть с третьей ссылкой в строке примера, тестирование, если uri содержит .org, .com, http, # или что-то другое.

Этот код показывает, как узнать, является ли URL локальным или нет в контексте замены на стороне клиента:

var text = '[external link](http://adomain.com/path/file.txt) ' +
           '[local link](../path/page.html) ' +
           '[local link](../path.org/http/file.com.php#fragment)';

text = text.replace(/\[([^\]]*)\]\(([^)]*)\)/g, function (_, g1, g2) {
    var myurl = document.createElement('a');
    myurl.href = g2;
    return window.location.hostname == myurl.hostname ? "locrep" : "extrep"; 
});   

console.log(text);
  • 0
    Спасибо за ввод, и я согласен, но я не запускаю этот код внутри браузера. Для локального файла уценки вам нужно указать префикс http: // или https: //, чтобы он мог получить доступ к Интернету, поэтому я мог бы просто сократить его до этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню