此正则表达式的每个部分都单独工作,但是当我将它们串在一起时,它与带有http或www后跟列出的TLD之一的URL不匹配。
(preg_match('/http\:\/\/(www\.)?[a-z](\.com|\.org|\.net|\.mil|\.edu|\.COM|\.ORG|\.NET|\.MIL|\.EDU)$/', $bandUrl))
答案 0 :(得分:3)
你可能在+
之后遗漏了[a-z]
(btw不正确以匹配所有有效的网址)。而不是列出大写和小写.TLD,您可以使用/i
标志:
preg_match('/http\:\/\/(www\.)?[a-z]+(\.com|\.org|\.net|\.mil|\.edu$/i',
顺便说一下,您可以使用filter_var($url, FILTER_VALIDATE_URL)
进行测试。
答案 1 :(得分:1)
您的[a-z]
只会匹配一个字符(即www.a.com)。你最好把它变成[a-z0-9\-]+
。请注意,+
表示不止一个。
答案 2 :(得分:1)
不要使用正则表达式。
filter_var('http://www.example.com', FILTER_VALIDATE_URL);
答案 3 :(得分:0)
对于匹配URL,以下代码应该有效:
<?php
$regex = "((https?|ftp)\:\/\/)?"; // SCHEME
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass
$regex .= "([a-z0-9-.]*)\.([a-z]{2,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
?>
Then, the correct way to check against the regex ist as follows:
<?php
if(preg_match("/^$regex$/", $url))
{
return true;
}
?>
Courtesy:
splattermania 对PHP手册的评论:http://php.net/manual/en/function.preg-match.php