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

时间:2011-06-21 15:06:54

标签: php regex

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

到目前为止,我一直在使用大量的框架代码,但是我找不到能够匹配像http://www.example.com/etcetc这样的网址的代码,但也能够找到像www.example.com/etcetc这样的内容和example.com/etcetc

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

13 个答案:

答案 0 :(得分:47)

为了匹配代码应该有效的所有类型的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
?>

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

<?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 Demo in regex101

答案 1 :(得分:15)

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

$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可能具有的有效字符。

答案 2 :(得分:4)

试试这个:

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

它与人们想要的完全一样。

使用或不使用http://https://www

答案 3 :(得分:2)

您可以在正则表达式后面使用问号使其成为有条件的,这样您就可以使用:

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

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

你可以做的只是使用替换方法来删除上面的内容,从而获得域名。取决于您需要的域名。

答案 4 :(得分:2)

我知道这是一篇旧帖子,但只是贡献我的解决方案,这是我在stackoverflow上找到的一些答案的组合。

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

匹配something.comhttp(s)://www。但是,与其他[something]://网址不匹配,但出于我的目的,这并不是必需的。

正则表达式匹配例如:

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

答案 5 :(得分:1)

尝试这样的事情:

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

答案 6 :(得分:1)

您可以尝试以下操作:

r"(http[s]:\/\/)?([\w-]+\.)+([a-z]{2,5})(\/+\w+)? "

选择:
1.可以以http://或https://开头(可选)
2.任何以单词(。)结尾的(单词)
3.后跟2至5个字符[a-z]
4.后跟“ / [anything]”(可选)
5.后跟空格

答案 7 :(得分:1)

我一直在使用以下代码,该代码适用于我的所有测试用例,并修复了在句号以句号(end.开头的句子结尾处可能触发的任何问题,有单个字符的首字母,例如'CC水暖”。以下正则表达式包含多个{2,},这意味着前一个模式有两个或多个匹配项。

((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]{2,}\.([a-zA-Z0-9\&\.\/\?\:@\-_=#]){2,}

匹配 URL,例如但不限于:

不匹配非URL,例如但不限于:

  • CC管道工
  • 句子结尾处的句号。
  • 单个字符,例如a.bx.y

请注意:由于上述原因,该将不匹配任何单个字符的网址,例如:a.co,但如果在前面则匹配通过URL方案,例如:http://a.co

答案 8 :(得分:0)

试试这个

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

答案 9 :(得分:0)

由于最近的php允许$出现在字符串中,并且preg匹配不起作用,因此我从@anubhava得到了很多问题的答案。

这是我用的:

// regex
$re = '/((https?|ftp):\/\/)?([a-z0-9+!*(),;?&=.-]+(:[a-z0-9+!*(),;?&=.-]+)?@)?([a-z0-9\-\.]*)\.(([a-z]{2,4})|([0-9]{1,3}\.([0-9]{1,3})\.([0-9]{1,3})))(:[0-9]{2,5})?(\/([a-z0-9+%-]\.?)+)*\/?(\?[a-z+&$_.-][a-z0-9;:@&%=+\/.-]*)?(#[a-z_.-][a-z0-9+$%_.-]*)?/i';
// match all
preg_match_all($re, $blob, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
// the first element of the array is the full match

答案 10 :(得分:0)

这个作曲家软件包在PHP中表现出色

prettier-eslint

["error", "always"]

答案 11 :(得分:-1)

如果它不必是正则表达式,您可以始终使用PHP中的验证过滤器。

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

filter_var混合 $ variable [, int $ filter = FILTER_DEFAULT [,混合 $ options]]);

Types of Filters

Validate Filters

答案 12 :(得分:-1)

如果您想确保 URL 以 HTTP/HTTPS 开头,则使用正则表达式:

https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)

如果您不需要 HTTP 协议:

[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)