Як було відмічено, ідеальний регулярний вираз є невловимим, але все ще здається розумним підходом (альтернативою є тести на стороні сервера або новий експериментальний URL-адрес URL ). Однак відповіді високого рейтингу часто повертають помилкові для загальних URL-адрес, але ще гірше буде заморожувати ваше додаток / сторінку на хвилини навіть на такому простому рядку isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
. Це було зазначено в деяких коментарях, але, мабуть, не ввели поганого значення, щоб побачити це. Такі підвішування робить цей код непридатним у будь-яких серйозних програмах. Я думаю, що це пов'язано з неодноразовими нечутливими наборами у подібному коді ((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...
. Вийміть "я", і воно не висить, але, звичайно, не спрацює за бажанням. Але навіть з прапором ігнорування випадку ці тести відхиляють високі значення Unicode, які дозволені.
Найкраще, про що вже говорилося:
function isURL(str) {
return /^(?:\w+:)?\/\/([^\s\.]+\.\S{2}|localhost[\:?\d]*)\S*$/.test(str);
}
Це походить від Github segmentio / is-url . Хороша річ у сховищі коду - ви можете бачити тестування та будь-які проблеми, а також тестові рядки, що проходять через нього. Існує гілка, яка дозволить рядкам відсутній протокол на зразок google.com
, хоча ви, мабуть, робите занадто багато припущень. Сховище було оновлено, і я не планую намагатися не відбиватися від дзеркала тут. Це було розбите на окремі тести , щоб уникнути RegEx Redos які можуть бути використані для атак DOS (я не думаю , що ви повинні турбуватися про те , що з на стороні клієнта JS, але ви повинні турбуватися про вашу сторінку висить так довго , що ваш відвідувач залишає ваш сайт).
Є ще одне сховище, яке я бачив, що може бути навіть кращим для isURL на dperini / regex-weburl.js , але воно дуже складне. У ньому є великий тестовий список дійсних та недійсних URL-адрес. Простий вище, як і раніше, передає всі позитиви і лише не блокує декілька дивних негативів, як http://a.b--c.de/
і спеціальні ips.
Що б ви не вибрали, запустіть його за допомогою цієї функції, яку я адаптував із тестів на dperini / regex-weburl.js, використовуючи інспектор Інструментів для розробників вашого браузера.
function testIsURL() {
//should match
console.assert(isURL("http://foo.com/blah_blah"));
console.assert(isURL("http://foo.com/blah_blah/"));
console.assert(isURL("http://foo.com/blah_blah_(wikipedia)"));
console.assert(isURL("http://foo.com/blah_blah_(wikipedia)_(again)"));
console.assert(isURL("http://www.example.com/wpstyle/?p=364"));
console.assert(isURL("https://www.example.com/foo/?bar=baz&inga=42&quux"));
console.assert(isURL("http://✪df.ws/123"));
console.assert(isURL("http://userid:password@example.com:8080"));
console.assert(isURL("http://userid:password@example.com:8080/"));
console.assert(isURL("http://userid@example.com"));
console.assert(isURL("http://userid@example.com/"));
console.assert(isURL("http://userid@example.com:8080"));
console.assert(isURL("http://userid@example.com:8080/"));
console.assert(isURL("http://userid:password@example.com"));
console.assert(isURL("http://userid:password@example.com/"));
console.assert(isURL("http://142.42.1.1/"));
console.assert(isURL("http://142.42.1.1:8080/"));
console.assert(isURL("http://➡.ws/䨹"));
console.assert(isURL("http://⌘.ws"));
console.assert(isURL("http://⌘.ws/"));
console.assert(isURL("http://foo.com/blah_(wikipedia)#cite-1"));
console.assert(isURL("http://foo.com/blah_(wikipedia)_blah#cite-1"));
console.assert(isURL("http://foo.com/unicode_(✪)_in_parens"));
console.assert(isURL("http://foo.com/(something)?after=parens"));
console.assert(isURL("http://☺.damowmow.com/"));
console.assert(isURL("http://code.google.com/events/#&product=browser"));
console.assert(isURL("http://j.mp"));
console.assert(isURL("ftp://foo.bar/baz"));
console.assert(isURL("http://foo.bar/?q=Test%20URL-encoded%20stuff"));
console.assert(isURL("http://مثال.إختبار"));
console.assert(isURL("http://例子.测试"));
console.assert(isURL("http://उदाहरण.परीक्षा"));
console.assert(isURL("http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com"));
console.assert(isURL("http://1337.net"));
console.assert(isURL("http://a.b-c.de"));
console.assert(isURL("http://223.255.255.254"));
console.assert(isURL("postgres://u:p@example.com:5702/db"));
console.assert(isURL("https://d1f4470da51b49289906b3d6cbd65074@app.getsentry.com/13176"));
//SHOULD NOT MATCH:
console.assert(!isURL("http://"));
console.assert(!isURL("http://."));
console.assert(!isURL("http://.."));
console.assert(!isURL("http://../"));
console.assert(!isURL("http://?"));
console.assert(!isURL("http://??"));
console.assert(!isURL("http://??/"));
console.assert(!isURL("http://#"));
console.assert(!isURL("http://##"));
console.assert(!isURL("http://##/"));
console.assert(!isURL("http://foo.bar?q=Spaces should be encoded"));
console.assert(!isURL("//"));
console.assert(!isURL("//a"));
console.assert(!isURL("///a"));
console.assert(!isURL("///"));
console.assert(!isURL("http:///a"));
console.assert(!isURL("foo.com"));
console.assert(!isURL("rdar://1234"));
console.assert(!isURL("h://test"));
console.assert(!isURL("http:// shouldfail.com"));
console.assert(!isURL(":// should fail"));
console.assert(!isURL("http://foo.bar/foo(bar)baz quux"));
console.assert(!isURL("ftps://foo.bar/"));
console.assert(!isURL("http://-error-.invalid/"));
console.assert(!isURL("http://a.b--c.de/"));
console.assert(!isURL("http://-a.b.co"));
console.assert(!isURL("http://a.b-.co"));
console.assert(!isURL("http://0.0.0.0"));
console.assert(!isURL("http://10.1.1.0"));
console.assert(!isURL("http://10.1.1.255"));
console.assert(!isURL("http://224.1.1.1"));
console.assert(!isURL("http://1.1.1.1.1"));
console.assert(!isURL("http://123.123.123"));
console.assert(!isURL("http://3628126748"));
console.assert(!isURL("http://.www.foo.bar/"));
console.assert(!isURL("http://www.foo.bar./"));
console.assert(!isURL("http://.www.foo.bar./"));
console.assert(!isURL("http://10.1.1.1"));}
А потім протестуйте цей рядок "a".
Дивіться це порівняння isURL regex від Mathias Bynens для отримання додаткової інформації перед тим, як опублікувати, здавалося б, великий регекс.
http
, воно за замовчуванням не має URL-адреси.