使用preg_match进行Url验证


Url validation with preg_match

我想确保链接来自所选的社交类型。帮助

    $socialType = 'youtube';
    $link = 'https://www.youtube.co.uk/watch?v=DBK-Cy9ge4M';
    if (!preg_match("/^(http|https):''/''/[a-z0-9_]+$socialType*''.[_a-z]{2,5}"."((:[0-9]{1,5})?''/.*)?$/i",$link)) 
    {
         return Response::json('inValid'); 
    }
    {
         return Response::json('Valid');
    }

将有两个选项作为-1.带预匹配-

$subject = "https://www.youtube.co.uk/watch?v=DBK-Cy9ge4M";
$pattern = '/^youtube/';
preg_match($pattern, substr($subject,7), $matches);
print_r($matches);

2.用strops作为(Ruslan Osmanov)-

$socialType = 'youtube';
$link = 'https://www.youtube.co.uk/watch?v=DBK-Cy9ge4M';
if (strpos($link, $socialType) !== false) {
    return Response::json('Valid');
}

您可以简单地使用strpos:检查链接是否包含子字符串

$link = 'https://www.youtube.co.uk/watch?v=DBK-Cy9ge4M';
$type = 'youtube';
if (strpos($link, $type) !== false) {
  // passed
}

或者使用一个简单的正则表达式,如果你想要更严格的检查:

$reg_type = preg_quote($type, '/');
if (preg_match("/^https?:'/'/(www'.)?$reg_type/", $link)) {
  // passed
}

注意,应该使用preg_quote对传递到正则表达式中的值进行转义。

这种模式应该足够了。不要过于复杂。通常不可能写出一个完美的正则表达式。例如,在不属于youtube的URL中,很难找到HTTP(S)协议前缀+可选的"www."+"youtube."。

此外,我不希望用一个适用于各种社交网络的通用正则表达式来得到答案。每个都有自己的模式。