pregmatch не работает, как задумано - PullRequest
0 голосов
/ 21 марта 2012

почему приведенная ниже проверка 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);

1 Ответ

0 голосов
/ 21 марта 2012

Существует несколько причин, по которым это не работает.

  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";
...