【问题标题】:pregmatch not working as intendedpreg_match 未按预期工作
【发布时间】:2012-03-21 04:07:09
【问题描述】:

为什么下面的 url 验证给我错误。如果我输入 url = www.google.ca,它会给我一个错误的 url。

function validateURL($url){
$regex = "((https?|ftp)://)?";  
$regex .= "([a-z0-9+!*(),;?&=$_.-]+(:[a-z0-9+!*(),;?&=$_.-]+)?@)?"; 
$regex .= "([a-z0-9-.]*).([a-z]{2,3})"; 
$regex .= "(:[0-9]{2,5})?";  
$regex .= "(/([a-z0-9+$_-].?)+)*/?";  
$regex .= "(?[a-z+&$_.-][a-z0-9;:@&%=+/$_.-]*)?";  
$regex .= "(#[a-z_.-][a-z0-9+$_.-]*)?";  
if(preg_match('/^$regex$/', $url)) 
{ 
echo $url."&nbsp;&nbsp;&nbsp;=".'<font color="blue">Valid URL</font>'; 
} 
else {
echo $url."&nbsp;&nbsp;&nbsp;=".'<font color="red">Invalid URL</font>';
}
}

$url = 'www.google.ca';

validateURL($url);

【问题讨论】:

    标签: php validation url preg-match


    【解决方案1】:

    这不起作用有几个原因。

    1. 's 括起来时不计算变量。因此,'/^$regex$/' 将完全按照其编写方式进行评估。
    2. 任何带有$" 的东西都会被评估。因此,$_ 之类的内容将被替换为变量 $_ 的内容(如果存在)。
    3. 您需要在 $regex 变量中转义反斜杠和问号。

    这将起作用:

    function validateURL($url) {
        $regex = '((https?|ftp):\/\/)?';  
        $regex .= '([a-z0-9+!*(),;?&=$_.-]+(:[a-z0-9+!*(),;?&=$_.-]+)?@)?'; 
        $regex .= '([a-z0-9-.]*).([a-z]{2,3})'; 
        $regex .= '(:[0-9]{2,5})?';  
        $regex .= '(\/([a-z0-9+$_-].?)+)*\/?';  
        $regex .= '(\?[a-z+&$_.-][a-z0-9;:@&%=+\/$_.-]*)?';  
        $regex .= '(#[a-z_.-][a-z0-9+$_.-]*)?';  
        return preg_match("/^{$regex}$/", $url) > 0;
    }
    
    $url = 'www.google.ca';
    
    if (validateURL($url))
        print "$url is valid\n";
    else
        print "$url is invalid\n";
    

    【讨论】:

    • if(preg_match("/^$regex$/", $url)) ...如果我这样做,我会收到以下错误 Unknown modifier '/'
    • 那么你还没有转义反斜杠。
    • .kk 我不再收到转义错误。但你确定验证有效,我输入了$url = "wwjw..google.ca",它说它是有效的
    • @Anonymous 我没有改变你的正则表达式的作用。
    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    • 2014-10-31
    • 2018-02-12
    • 2014-01-20
    • 2015-01-13
    相关资源
    最近更新 更多