Як було відмічено, ідеальний регулярний вираз є невловимим, але все ще здається розумним підходом (альтернативою є тести на стороні сервера або новий експериментальний 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-адреси.