正则表达式模式匹配url有或没有http:// www

Edm*_*jas 33 php regex

我根本不擅长正则表达式.

我已经使用了大量的框架代码到今天为止,但我无法找到一个可以媲美像一个URL http://www.example.com/etcetc也能赶上像www.example.com/etcetcexample.com/etcetc.

任何帮助都会很棒.多谢你们!

anu*_*ava 50

为了匹配以下代码应该工作的所有类型的URL:

<?php
    $regex = "((https?|ftp)://)?"; // SCHEME
    $regex .= "([a-z0-9+!*(),;?&=$_.-]+(:[a-z0-9+!*(),;?&=$_.-]+)?@)?"; // User and Pass
    $regex .= "([a-z0-9\-\.]*)\.(([a-z]{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
?>
Run Code Online (Sandbox Code Playgroud)

然后,检查正则表达式的正确方法如下:

<?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);
?>
Run Code Online (Sandbox Code Playgroud)

Courtesy:splattermania对PHP手册的评论:http://php.net/manual/en/function.preg-match.php

regex101中的RegEx演示

  • 我喜欢你用评论打破它的方式.它有点像正常的自助餐,在那里你可以挑选你想放在盘子里的东西 (4认同)
  • +1方法内的注释通常是代码嗅觉的标志.但是,在*regex或复杂的SQL查询中注释*是要走的路. (2认同)
  • 嗨,我必须在每个az旁边添加AZ,因为youtube就像链接一样.但我认为它仍然很优秀 (2认同)

H A*_*døµ 16

在我测试的所有情况下,这对我有用:

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

测试:

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/
Run Code Online (Sandbox Code Playgroud)

每个有效的互联网URL至少有一个点,因此上述模式只会尝试查找至少两个由点链接的字符串,并且具有URL可能具有的有效字符.

  • 简化了这个正则表达式:``/^[a-z0-9./?:@@--=#]+\.([ - z0-9./?:@\-_=#])*$/i`` - 元字符不需要在方括号内转义 - 剥去前面的可选部分,不需要验证url(在我的用例中不需要捕获的值) - 简化使用无大小修饰符的模式,而不是重复字符组中的所有内容 (2认同)

小智 5

您可以在正则表达式后使用问号使其成为有条件的,因此您可以使用:

http:\/\/(www\.)?
Run Code Online (Sandbox Code Playgroud)

这将匹配任何具有 http://www. 或 http://(没有 www。)

您可以使用替换方法来删除上述内容,从而获得域。这取决于您需要域的用途。


Jig*_*ev. 5

尝试这个:

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

它的工作原理完全符合人们的需求。

这需要用或出http://https://www