Есть ли в JavaScript способ проверить, является ли строка URL-адресом?
RegExes исключены, потому что URL, скорее всего, написан как stackoverflow
; то есть сказать , что она не может иметь .com
, www
или http
.
javascript
string
url
Bruno
источник
источник
http
, по умолчанию это не URL.<scheme>:<scheme-specific-part>
href
элемент привязки, работает при вызовеwindow.open(url)
, указывает на то, что действительно существует, работает в расположении браузера бар или комбинация вышеперечисленного? Вы получите очень разные ответы в зависимости от того, какой из них вам небезразличен.Ответы:
Смежный вопрос с ответом:
Соответствие URL регулярного выражения Javascript
Или это регулярное выражение из Devshed :
источник
{ title: "Stackoverflow", uri: "http://stackoverflow.com" }
Обновление»: действительно, см. Code.google.com/chrome/extensions/bookmarks.htmlinvalid quantifier
. Любая идея?SyntaxError: Invalid regular expression: /^(https?://)?((([a-zd]([a-zd-]*[a-zd])*).)+[a-z]{2,}|((d{1,3}.){3}d{1,3}))(:d+)?(/[-a-zd%_.~+]*)*(?[;&a-zd%_.~+=-]*)?(#[-a-zd_]*)?$/: Invalid group
Google Chrome (версия 30.0.1599.101) (Mac OS X: 10.8.5)RegExp
вас, вы должны дважды избежать обратной косой черты - в противном случае вы получите ошибки, такие как недопустимая группа .источник
http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707
start = new Date(); isURL("http://michalstefanow.com"); end = new Date(); diff = end - start; console.log(diff)
Я поставил чайник, пошел в туалет, позвонил моей маме, и все было сделано в кратчайшие сроки ...true
дляaaa
.isURL('12345678901234567890123')
добавьте еще несколько символов, и это еще хуже.Вы можете попробовать использовать
URL
конструктор : если он не выбрасывает, строка является допустимым URL:Термин «URL» определен в RFC 3886 (как URI); оно должно начинаться с имени схемы, а имя схемы не ограничивается http / https.
Известные примеры:
www.google.com
недействительный URL (отсутствует схема)javascript:void(0)
допустимый URL, хотя не HTTPhttp://..
является действительной URL, с принимающим бытием..
; решает ли это зависит от вашего DNShttps://google..com
действительный URL, такой же как вышеЕсли вы хотите проверить, является ли строка действительным HTTP-URL:
источник
href
атрибута для<a>
. Действительный URL должен начинаться с имени схемы , напримерhttps://
.isValidUrl("javascript:void(0)")
http://..
илиhttp:///a
Вместо того, чтобы использовать регулярное выражение, я бы рекомендовал использовать элемент привязки.
когда вы устанавливаете
href
свойство ananchor
, устанавливаются различные другие свойства.источник
Однако, если значение
href
, с которым связано, не является допустимым URL-адресом, значением этих вспомогательных свойств будет пустая строка.Редактировать: как указано в комментариях: если используется недействительный URL, свойства текущего URL могут быть заменены.
Итак, если вы не передаете URL текущей страницы, вы можете сделать что-то вроде:
источник
a.href
недействителен,parser.host
возвращает имя хоста страницы, на которой вы сейчас находитесь, а не ожидаемоеfalse
.<a href="invalidurl">
она делает идти к вашему домену. Он добавляется в конец текущего URL. Таким образом, Chrome делает правильную вещь, предоставляя вам текущее имя хоста из элемента "parser".function isValidURL(str)
: гораздо лучше, чем с помощью регулярных выражений! Спасибо!Я использую функцию ниже для проверки URL с или без
http/https
:источник
https://sdfasdp.ppppppppppp
т. Е. Возвращение,true
но мое возвращение,false
которое, я думаю, ожидается.sadf@gmail.com
... не так ли? Я думаю, что это не должно бытьЧтобы проверить URL с помощью JavaScript, показано ниже
источник
(http|https)
до(?:https?)
; б):{0,1}
до:?
; в)[0-9]
до\d
Положитесь на библиотеку: https://www.npmjs.com/package/valid-url
источник
{
в URLУлучшение принятого ответа ...
Позволяет символ @ в пути, например, https://medium.com/@techytimo
источник
Вот еще один метод.
источник
new URL(string)
работает код Павла. Оба теста имеют идентичные результаты со всеми крайними случаями, которые я тестировал. Мне нравится его код, потому что он проще и не требует создания элементов, но ваш - в несколько раз быстрее (возможно, потому, что он не создает el после первого использования).(У меня нет представителей, чтобы комментировать пример ValidURL ; поэтому опубликуйте это как ответ.)
Хотя использование относительных к протоколу URL не рекомендуется ( относящиеся к протоколу URL ), они иногда работают. Чтобы проверить такой URL с помощью регулярного выражения, часть протокола может быть необязательной, например:
Как уже отмечалось, регулярное выражение, похоже, не самый подходящий подход для проверки URL.
источник
isValidURL("https://d1f4470da51b49289906b3d6cbd65074@app.getsentry.com/13176")
@
. Это не висит в моих браузерах .Вы можете использовать URL нативного API :
источник
Как уже отмечалось, идеальное регулярное выражение неуловимо, но все же кажется разумным подходом (альтернативы - тесты на стороне сервера или новый экспериментальный URL API ). Однако высокопоставленные ответы часто возвращают false для обычных URL-адресов, но, что еще хуже, ваше приложение / страница замораживается на несколько минут даже при такой простой строке, как
isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
. На это было указано в некоторых комментариях, но, скорее всего, для его просмотра не было введено неправильное значение. Такое зависание делает этот код непригодным для использования в любом серьезном приложении. Я думаю, что это связано с повторяющимися нечувствительными к регистру наборами в коде, как((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...
. Выньте «я», и оно не зависнет, но, конечно, не будет работать так, как хотелось бы. Но даже с флагом игнорирования регистра эти тесты отклоняют допустимые высокие значения Юникода.Лучшее уже упоминалось:
Это происходит от Github segmentio / is-url . Хорошая вещь о репозитории кода - вы можете видеть тестирование и любые проблемы, а также тестовые строки, проходящие через него. Есть ветка, которая позволила бы пропустить строки, например
google.com
, хотя вы, вероятно, делаете слишком много предположений. Хранилище было обновлено, и я не собираюсь пытаться держать зеркало здесь. Это было разбито на отдельные тесты, чтобы избежать повторов RegEx, которые могут быть использованы для DOS-атак (я не думаю, что вам нужно беспокоиться об этом с js на стороне клиента, но вам нужно беспокоиться о том, что ваша страница зависает так долго, что ваш посетитель покидает ваш сайт).Я видел еще один репозиторий, который может быть даже лучше для isURL в dperini / regex-weburl.js , но он очень сложный. Он имеет больший тестовый список действительных и недействительных URL. Простой выше все еще пропускает все позитивы и не может блокировать только несколько нечетных негативов, таких
http://a.b--c.de/
как специальные ips.Независимо от того, что вы выберете, запустите его с помощью этой функции, которую я адаптировал из тестов dperini / regex-weburl.js, используя в вашем браузере инструмент разработчика инструментов.
А затем проверьте эту строку «а».
Посмотрите это сравнение регулярных выражений isURL от Mathias Bynens для получения дополнительной информации, прежде чем публиковать, казалось бы, замечательное регулярное выражение.
источник
isURL('a'.repeat(100))
миллионы раз в секунду (более сложное из dperini на самом деле быстрее). Некоторые из высокопоставленных ответов формы ([a-zA-Z] +) * могут занять несколько часов, чтобы завершить это один раз. Посмотрите RedEx Redos для получения дополнительной информации.Я не могу комментировать пост, который ближе всего к # 5717133 , но ниже я понял, как заставить @ tom-gullen regex работать.
источник
var pattern = new RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');
Используйте validator.js
ES6
Нет ES6
Вы также можете точно настроить поведение этой функции, передав необязательный
options
объект в качестве второго аргументаisURL
Вот
options
объект по умолчанию :host_whitelist
иhost_blacklist
может быть массивами хостов. Они также поддерживают регулярные выражения.источник
Одна функция, которую я использовал для проверки URL-адреса "строка":
Эта функция возвращает логическое значение, является ли строка URL-адресом.
Примеры:
источник
Это довольно сложно сделать с чистым регулярным выражением, потому что у URL много «неудобств».
Например, доменные имена имеют сложные ограничения на дефисы:
а. Разрешено иметь много последовательных дефисов в середине.
б. но первый и последний символ имени домена не может быть дефисом
с. 3-й и 4-й символ не может быть дефисом
Точно так же номер порта может быть только в диапазоне 1-65535. Это легко проверить, если вы извлекаете часть порта и конвертируете в нее,
int
но довольно сложно проверить с помощью регулярного выражения.Также нет простого способа проверить действительные доменные расширения. В некоторых странах есть домены второго уровня (например, «co.uk»), или расширение может быть длинным словом, например «.international». И новые TLD добавляются регулярно. Этот тип вещей может быть проверен только по жестко закодированному списку. (см. https://en.wikipedia.org/wiki/Top-level_domain )
Кроме того, существуют URL-адреса, адреса FTP и т. Д. Все они имеют разные требования.
Тем не менее, вот функция, которая обрабатывает почти все, кроме:
источник
Я думаю, что использование нативного URL API лучше, чем сложные шаблоны регулярных выражений, как предложил @pavlo. У него есть некоторые недостатки, которые мы можем исправить с помощью дополнительного кода. Этот подход не подходит для следующего действительного URL.
Мы можем добавить отсутствующий протокол заранее, чтобы избежать этого. Он также не может обнаружить следующий неверный URL.
Так зачем проверять весь URL? мы можем просто проверить домен. Я позаимствовал регулярное выражение для подтверждения домена отсюда .
hostname
Атрибут пустая строка дляjavascript:void(0)
, поэтому она работает для этого тоже, и вы можете также добавить IP - адрес верификатор тоже. Я бы хотел больше всего придерживаться нативного API и надеюсь, что он начнет поддерживать все в ближайшем будущем.источник
new URL
оно содержит ложные отрицания, которых нет в тестах, которые я проводил Это вызывает:http://142.42.1.1 //false
и блокирует высокие строки Unicode.Вопрос задает метод проверки для URL, например
stackoverflow
, без протокола или любой точки в имени хоста. Таким образом, дело не в проверке синтаксиса URL, а в проверке, является ли он действительным, путем его фактического вызова.Я попробовал несколько способов узнать, существует ли истинный URL и можно ли его вызывать из браузера, но не нашел способа проверить с помощью javascript заголовок ответа на вызов:
click()
метода.'GET'
- это хорошо, но оно имеет различные ограничения из-заCORS
политик и не подходит для использованияajax
, так как URL-адрес может быть любым за пределами домена моего сервера.https
протоколу и выдает исключение при вызове незащищенных URL-адресов.Итак, лучшее решение, которое я могу придумать, - это заставить некоторый инструмент работать
CURL
с использованием javascript, пытаясь что-то вродеcurl -I <url>
. К сожалению, я не нашел ни одного, и на первый взгляд это не возможно. Буду признателен за любые комментарии по этому вопросу.Но, в конце концов, у меня работает сервер,
PHP
и, поскольку я использую Ajax почти для всех своих запросов, я написал функцию на стороне сервера, чтобы выполнить там запрос curl и вернуться в браузер.Что касается отдельного слова url в вопросе «stackoverflow», оно приведет меня к тому
https://daniserver.com.ar/stackoverflow
, где daniserver.com.ar - мой собственный домен.источник
foo
и предположить, что это http или https или .com или .es или какой-либо из бесчисленных суффиксов? Вы продолжаете бросать кухонную раковину в это, пока не получите истинное?Кажется, это одна из самых сложных проблем в CS;)
Вот еще одно неполное решение, которое работает достаточно хорошо для меня и лучше, чем другие, которые я видел здесь. Я использую input [type = url] для этого, чтобы поддержать IE11, иначе было бы намного проще использовать window.URL вместо проверки:
Чтобы принять неполные данные, такие как «www.mydomain.com», он также сделает его действительным, если в этих случаях протокол будет «http», и вернет действительный URL, если адрес действителен. Возвращает ложь, когда недействителен.
Он также поддерживает домены IPv4, но не IPv6.
источник
В моем случае мое единственное требование состоит в том, чтобы пользовательский ввод не интерпретировался как относительная ссылка, если он помещен в href тега, и ответы здесь были либо немного OTT для этого, либо разрешенные URL не соответствуют моим требованиям, поэтому это это то, что я собираюсь с:
То же самое может быть достигнуто довольно легко без регулярных выражений.
источник
это работает со мной
источник
Если вы можете изменить тип ввода, я думаю, что это решение будет гораздо проще:
Вы можете просто использовать
type="url"
в своем входе и проверить его с помощьюcheckValidity()
JSНапример:
your.html
your.js
источник
Это демонстративно не самый эффективный подход, но он легко читается и может быть сформирован в соответствии с вашими потребностями. И здесь проще добавить регулярное выражение / сложность. Так что здесь очень прагматичный подход
ТЕСТ:
источник
Матиас Биненс составил список известных регулярных выражений URL с тестовыми URL. Нет особых причин писать новое регулярное выражение; просто выберите существующий, который подходит вам лучше всего.
Но таблица сравнения для этих регулярных выражений также показывает, что почти невозможно выполнить проверку URL с помощью одного регулярного выражения. Все регулярные выражения в списке Биненса дают ложные срабатывания и ложные отрицания.
Я предлагаю вам использовать существующий анализатор URL (например,
new URL('http://www.example.com/')
в JavaScript), а затем применить проверки, которые вы хотите выполнить, к проанализированной и нормализованной форме URL, соответственно. его компоненты. ИспользованиеURL
интерфейса JavaScript имеет дополнительное преимущество, заключающееся в том, что он будет принимать только те URL-адреса, которые действительно принимаются браузером.Также следует помнить, что технически некорректные URL-адреса все еще могут работать. Например
http://w_w_w.example.com/
,http://www..example.com/
,http://123.example.com/
все они имеют недопустимое имя хоста часть , но каждый браузер я знаю , что будет пытаться открыть их без жалоб, а также при указании IP - адреса для этих недопустимых имен в/etc/hosts/
таких URL - адресов будет даже работать , но только на вашем компьютере.Поэтому вопрос не в том, является ли URL действительным, а в том, какие URL работают и должны быть разрешены в определенном контексте.
Если вы хотите выполнить проверку URL, есть много деталей и крайних случаев, которые легко пропустить:
http://user:password@www.example.com/
.http://www.stackoverflow.com.
).[-0-9a-zA-z]
определенно больше не является достаточным.co.uk
и многие другие).Какие из этих ограничений и правил применяются, зависит от требований и вкуса проекта.
Недавно я написал валидатор URL-адресов для веб-приложения, которое подходит для пользовательских URL-адресов на форумах, в социальных сетях и т. П. Не стесняйтесь использовать его в качестве основы для своей собственной:
Я также написал пост в блоге «Подробная информация о валидации URL» с более подробной информацией.
источник
Я изменяю функцию на Match +, чтобы внести изменения здесь с косой чертой и ее работой: (http: // и https) оба
источник
Вот только очень простая проверка, чтобы убедиться, что есть действительный протокол, и расширение домена должно состоять из двух или более символов.
источник
Если вам нужна поддержка,
https://localhost:3000
используйте эту модифицированную версию регулярного выражения [Devshed].источник
Есть несколько тестов, использующих конструктор URL, которые не определяют, является ли входная строка или объект URL.
источник
2020 Обновление. Чтобы расширить оба превосходных ответа от @iamnewton и @Fernando Chavez Herrera, я начал видеть, как
@
их используют в пути URL-адресов.Итак, обновленное регулярное выражение:
Если вы хотите разрешить это в строке запроса и хэше, используйте:
Это, как говорится, я не уверен, есть ли правило белой книги, запрещающее
@
в строке запроса или хэш.источник
Ответов уже много, но вот еще один вклад: взятый непосредственно из
URL
проверки валидности полифилла, используйтеinput
элемент с,type="url"
чтобы воспользоваться встроенной в браузер проверкой валидности:Источник
источник