Какое регулярное выражение лучше всего проверить, является ли строка допустимым URL-адресом? - PullRequest
719 голосов
/ 02 октября 2008

Как я могу проверить, является ли данная строка действительным URL-адресом?

Мои знания регулярных выражений являются базовыми и не позволяют мне выбирать из сотен регулярных выражений, которые я уже видел в Интернете.

Ответы [ 52 ]

1 голос
/ 12 декабря 2013

Для проверки URL регулярное выражение будет:

^http(s{0,1})://[a-zA-Z0-9_/\\-\\.]+\\.([A-Za-z/]{2,5})[a-zA-Z0-9_/\\&\\?\\=\\-\\.\\~\\%]*
1 голос
/ 22 июля 2011

Я думаю, что некоторые люди не смогли использовать ваш php-код из-за подразумеваемых модификаторов. Я скопировал ваш код как есть и использовал в качестве примера:

if(
    preg_match(
        "/^{$IRI_reference}$/iu",
        'http://www.url.com'
    )
){
    echo 'true';
}

Обратите внимание на модификаторы "i" и "u". без "u" php выдает исключение, говорящее:

Warning: preg_match() [function.preg-match]: Compilation failed: character value in \x{...} sequence is too large at offset XX
1 голос
/ 26 ноября 2018

Я думаю, что это очень простой способ. И это работает очень хорошо.

var hasURL = (str) =>{
	var url_pattern = new RegExp("(www.|http://|https://|ftp://)\w*");
	if(!url_pattern.test(str)){
		document.getElementById("demo").innerHTML = 'No URL';
	}
	else
		document.getElementById("demo").innerHTML = 'String has a URL';
};
<p>Please enter a string and test it has any url or not</p>
<input type="text" id="url" placeholder="url" onkeyup="hasURL(document.getElementById('url').value)">
<p id="demo"></p>
1 голос
/ 07 сентября 2017

Как насчет этого:

^(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})$

Вот тесты:

Test cases

Вы можете попробовать это в здесь: https://regex101.com/r/mS9gD7/41

1 голос
/ 01 января 2018

Насколько я нашел, это выражение хорошо для меня-

(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})

Рабочий пример-

function RegExForUrlMatch()
{
  var expression = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})/g;

  var regex = new RegExp(expression);
  var t = document.getElementById("url").value;

  if (t.match(regex)) {
    document.getElementById("demo").innerHTML = "Successful match";
  } else {
    document.getElementById("demo").innerHTML = "No match";
  }
}
<input type="text" id="url" placeholder="url" onkeyup="RegExForUrlMatch()">

<p id="demo">Please enter a URL to test</p>
0 голосов
/ 14 февраля 2019
https?:\/{2}(?:[\/-\w.]|(?:%[\da-fA-F]{2}))+

Вы можете использовать этот шаблон для определения URL.

Ниже приводится доказательство концепции

RegExr: Детектор URL

0 голосов
/ 24 октября 2012

Это довольно старая тема, и вопрос требует валидатора URL на основе регулярных выражений. Я наткнулся на нить, ища точно то же самое. Хотя вполне возможно, можно написать действительно всеобъемлющее регулярное выражение для проверки URL-адресов. В конце концов я остановился на другом способе работы - с помощью функции PHP parse_url .

Возвращает логическое значение false, если URL не может быть проанализирован. В противном случае он возвращает схему, хост и другую информацию. Этого вполне может быть недостаточно для самостоятельной комплексной проверки URL, но его можно углубленно изучить для дальнейшего анализа. Если целью является просто поймать опечатки, недопустимые схемы и т. Д. Это вполне адекватно!

0 голосов
/ 26 сентября 2018

Интересно, что ни один из приведенных выше ответов не работал для того, что мне было нужно, поэтому я решил, что предложу свое решение. Мне нужно было сделать следующее:

  • Совпадение http(s)://www.google.com, http://google.com, www.google.com и google.com
  • Соответствует ссылкам стиля разметки Github, например [Google](http://www.google.com)
  • Соответствует всем возможным доменным расширениям, таким как .com, или .io, или .guru, и т. Д. В основном любые длиной от 2 до 6 символов
  • Разделите все на нужные группы, чтобы я мог получить доступ к каждой части при необходимости.

Здесь было решение:

/^(\[[A-z0-9 _]*\]\()?((?:(http|https):\/\/)?(?:[\w-]+\.)+[a-z]{2,6})(\))?$

Это дает мне все вышеперечисленные требования. При необходимости вы можете добавить возможность для ftp и файла:

/^(\[[A-z0-9 _]*\]\()?((?:(http|https|ftp|file):\/\/)?(?:[\w-]+\.)+[a-z]{2,6})(\))?$
0 голосов
/ 27 июля 2018

Лучшее регулярное выражение, которое я нашел: /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi

Для ios swift: (^|\\s)((https?:\\/\\/)?[\\w-]+(\\.[\\w-]+)+\\.?(:\\d+)?(\\/\\S*)?)

http://jsfiddle.net/9BYdp/1/

Найдено здесь

0 голосов
/ 07 марта 2018

После тщательного поиска я, наконец, согласился со следующим

^[a-zA-Z0-9]+\:\/\/[a-zA-Z0-9]+\.[-a-zA-Z0-9]+\.?[a-zA-Z0-9]+$|^[a-zA-Z0-9]+\.[-a-zA-Z0-9]+\.[a-zA-Z0-9]+$

И эта штука работает для общих ссылок в будущих URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...