我根本不擅长正则表达式。
到目前为止,我一直在使用大量的框架代码,但是我找不到能够匹配像http://www.example.com/etcetc
这样的网址的代码,但也能够找到像www.example.com/etcetc
这样的内容和example.com/etcetc
。
任何帮助都会很棒。多谢你们!
答案 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.com
,http(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,例如但不限于:
a.b
或x.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)
答案 11 :(得分:-1)
如果它不必是正则表达式,您可以始终使用PHP中的验证过滤器。
filter_var('http://example.com', FILTER_VALIDATE_URL);
filter_var(混合 $ variable [, int $ filter = FILTER_DEFAULT [,混合 $ options]]);
答案 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()@:%_\+.~#?&//=]*)