У меня есть регулярное выражение, которое позволяет мне находить несколько URL-адресов в строке. У него два негативных взгляда<<‘и’ .onion ‘.
В настоящее время первый запрос работает как положено, он предотвращает совпадение, если URL заканчивается на ‘<<». Второй (‘.onion’) не работает должным образом, он предотвращает сопоставление всей строки, если она найдена.
PCRE:
(?i)\b(?!.*?\.onion)
(?>
(?:
[a-z][\w-]+:
(?:
/{1,3}
|
[a-z0-9%]
)
|
ftp://
|
www\d{0,3}[.]
|
[a-z0-9.\-]+[.][a-z]{2,4}/
)
(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+?(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*?\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))\b(?!<<)
Если я переместлю второй запрос в конец, он продолжит странно себя вести, сопоставляя URL-адрес, который он должен игнорировать, в то же время не сопоставляя подлинные URL-адреса перед ним.
Пример строки (предполагаемые совпадения выделены жирным шрифтом):
www.google.com http://wikipedia.org www.google.com<<
www.google.com http://wikipedia.org<< www.google.com
www.google.com<< http://wikipedia.org www.google.com
www.google.com http://wikipedia.org www.google.onion
Я недавно задал похожий вопрос, и из этого возникло текущее выражение.
Задача ещё не решена.
Других решений пока нет …