不同类型的正则表达式匹配网址

时间:2011-05-27 15:20:20

标签: php regex

此正则表达式的每个部分都单独工作,但是当我将它们串在一起时,它与带有http或www后跟列出的TLD之一的URL不匹配。

(preg_match('/http\:\/\/(www\.)?[a-z](\.com|\.org|\.net|\.mil|\.edu|\.COM|\.ORG|\.NET|\.MIL|\.EDU)$/', $bandUrl))

4 个答案:

答案 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