Регулярный шаблон выражения для соответствия URL-адресу с или без http: // www

Я не очень хорошо разбираюсь в регулярных выражениях.

На сегодняшний день я использую много кода фреймворка, но я не могу найти тот, который способен сопоставлять URL-адрес, например http://www.example.com/etcetc но также способен поймать что-то вроде www.example.com/etcetc и example.com/etcetc .

Любая помощь будет большой. Спасибо, парни!

Для соответствия всем типам URL следующий код должен работать:

 <?php $regex = "((https?|ftp)://)?"; // SCHEME $regex .= "([a-z0-9+!*(),;?&=$_.-]+(:[a-z0-9+!*(),;?&=$_.-]+)?@)?"; // User and Pass $regex .= "([a-z0-9\-\.]*)\.(([az]{2,4})|([0-9]{1,3}\.([0-9]{1,3})\.([0-9]{1,3})))"; // Host or IP $regex .= "(:[0-9]{2,5})?"; // Port $regex .= "(/([a-z0-9+$_%-]\.?)+)*/?"; // Path $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+/$_.-]*)?"; // GET Query $regex .= "(#[a-z_.-][a-z0-9+$%_.-]*)?"; // Anchor ?> . <?php $regex = "((https?|ftp)://)?"; // SCHEME $regex .= "([a-z0-9+!*(),;?&=$_.-]+(:[a-z0-9+!*(),;?&=$_.-]+)?@)?"; // User and Pass $regex .= "([a-z0-9\-\.]*)\.(([az]{2,4})|([0-9]{1,3}\.([0-9]{1,3})\.([0-9]{1,3})))"; // Host or IP $regex .= "(:[0-9]{2,5})?"; // Port $regex .= "(/([a-z0-9+$_%-]\.?)+)*/?"; // Path $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+/$_.-]*)?"; // GET Query $regex .= "(#[a-z_.-][a-z0-9+$%_.-]*)?"; // Anchor ?> 

Затем правильный способ проверки регулярного выражения выглядит следующим образом:

 <?php if(preg_match("~^$regex$~i", 'www.example.com/etcetc', $m)) var_dump($m); if(preg_match("~^$regex$~i", 'http://www.example.com/etcetc', $m)) var_dump($m); ?> 

Courtesy: Комментарии, сделанные splattermania в руководстве PHP: http://php.net/manual/en/function.preg-match.php

Демоверсия RegEx в regex101

Это работает для меня во всех случаях, которые я тестировал:

 $url_pattern = '/((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z0-9\&\.\/\?\:@\-_=#])*/'; 

тесты:

 http://test.test-75.1474.stackoverflow.com/ https://www.stackoverflow.com https://www.stackoverflow.com/ http://wwww.stackoverflow.com/ http://wwww.stackoverflow.com http://test.test-75.1474.stackoverflow.com/ http://www.stackoverflow.com http://www.stackoverflow.com/ stackoverflow.com/ stackoverflow.com http://www.example.com/etcetc www.example.com/etcetc example.com/etcetc user:pass@example.com/etcetc example.com/etcetc?query=aasd example.com/etcetc?query=aasd&dest=asds http://stackoverflow.com/questions/6427530/regular-expression-pattern-to-match-url-with-or-without-http-www http://stackoverflow.com/questions/6427530/regular-expression-pattern-to-match-url-with-or-without-http-www/ 

Каждый действующий интернет-URL имеет хотя бы одну точку, поэтому приведенный выше шаблон попробует найти любую по крайней мере две строки, скованные точкой, и имеет допустимые символы, которые могут иметь URL.

Попробуй это:

/^http:\/\/|(www\.)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}(:[0-9]{1,5})?(\/.*)?$/

Он работает точно так же, как люди хотят.

Он берется с или без http:// , https:// и www .

Вы можете использовать знак вопроса после регулярного выражения, чтобы сделать его условным, чтобы вы хотели использовать:

 http:\/\/(www\.)? 

Это будет соответствовать любому, что есть либо http: // www . или http: // (без www.)

То, что вы можете сделать, это просто использовать метод replace для удаления вышеуказанного, тем самым вы получите домен. Зависит от того, для чего нужен домен.

Я знаю, что это старый пост, но только способствование моему решению, которое представляет собой комбинацию некоторых ответов, которые я нашел здесь, в stackoverflow.

 /(https?://)?((?:(\w+-)*\w+)\.)+(?:[az]{2})(\/?\w?-?=?_?\??&?)+[\.]?([a-z0-9\?=&_\-%#])?/g 

Соответствует something.com , http(s):// или www . Не совпадает с другим [something]:// URL-адреса, но для моей цели это необязательно.

Регулярное выражение соответствует, например:

 http://foo.co.uk/ www.regex.com/foo.html?q=bar$some=thi-ng,regex regex.foo.com/blog 

Попробуйте что-то вроде этого:

 .*([\w-]+\.)+[az]{2,5}(/[\w-]+)* 

Попробуй это

 $url_reg = /(ftp|https?):\/\/(\w+:?\w*@)?(\S+)(:[0-9]+)?(\/([\w#!:.?+=&%@!\/-])?)?/; 

Если это не должно быть регулярное выражение, вы всегда можете использовать фильтры Validate, которые находятся в PHP.

 filter_var('http://example.com', FILTER_VALIDATE_URL); 

filter_var ( mixed $ variable [, int $ filter = FILTER_DEFAULT [, mixed $ options]]);

Типы фильтров

Проверка фильтров