Я пытаюсь создать регулярное выражение, которое будет соответствовать 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. Какие-либо предложения?
Есть две проблемы.
\[.*?\]
Будет [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]
так что это будет соответствуют утверждениям.Вы можете исправить 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
Тестирование, если 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);