另一种正则表达式来匹配url

问题描述

| 此正则表达式的每个部分都可以单独工作,但是当我将它们串在一起时,它与带有http或www的URL不匹配,后跟列出的TLD之一。
(preg_match(\'/http\\:\\/\\/(www\\.)?[a-z](\\.com|\\.org|\\.net|\\.mil|\\.edu|\\.COM|\\.ORG|\\.NET|\\.MIL|\\.EDU)$/\',$bandUrl))
    

解决方法

        您可能在
[a-z]
之后遗漏了
+
(顺便说一句,它不匹配所有有效的URL)。而不是同时列出大写和小写的.TLD,您可以使用
/i
标志:
preg_match(\'/http\\:\\/\\/(www\\.)?[a-z]+(\\.com|\\.org|\\.net|\\.mil|\\.edu$/i\',
顺便说一句,您也可以使用
filter_var($url,FILTER_VALIDATE_URL)
进行测试。     ,        您的
[a-z]
仅可匹配一个字符(即www.a.com)。最好将它做成
[a-z0-9\\-]+
之类的东西。请注意,“ 1”表示多个。     ,        不要使用正则表达式。
filter_var(\'http://www.example.com\',FILTER_VALIDATE_URL);
    ,        对于匹配的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