Php 检查网站是否在阻止列表中

Php 检查网站是否在阻止列表中,php,regex,oop,url,Php,Regex,Oop,Url,我正在创建一个处理重定向到外部位置的类。我创建了一个名为isBlocked的方法,它返回一个布尔结果。此功能的工作原理如下: 它通过$\u blocked变量循环,并比较是否找到输入字符串,是否返回true或false。下面是实际情况,因为我的解释不够 public static function isBlocked($location) { for($i = 0; $i < sizeof(self::$_blocked); $i++) { if(se

我正在创建一个处理重定向到外部位置的类。我创建了一个名为
isBlocked
的方法,它返回一个布尔结果。此功能的工作原理如下:

它通过
$\u blocked
变量循环,并比较是否找到输入字符串,是否返回true或false。下面是实际情况,因为我的解释不够

public static function isBlocked($location)
{
     for($i = 0; $i < sizeof(self::$_blocked); $i++)
     {
         if(self::$_blocked[$i] === $location)
         {
             return true;
         }
         else 
         {
             return false;
          }
     }
}
公共静态功能被阻止($location)
{
对于($i=0;$i
这是完美的,问题在于,例如,假设“google.com”在列表中,输入为“www.google.com”,它将返回false。这是显而易见的,因为am使用相同的运算符
==

问题是:除了
url\u encode
url\u decode
之外,PHP中是否还有其他可以处理url的函数?很明显,我可以创建正则表达式,但请告诉我是否有其他方法


提前谢谢。

您可以用字符串替换www

public static function isBlocked($location)
{
     for($i = 0; $i < sizeof(self::$_blocked); $i++)
     {
         if(self::$_blocked[$i] === str_replace("www.","",$location))
         {
             return true;
         }

             return false;
     }
}
我只是举个例子: 写了@JaredFarrish并采纳了这个特殊案例:

<?php

function isBlocked($location)
{
    $blocked = [
        'google.com',
        'www.google.com',
        'play.google.com',
        'developers.google.com',
    ];
    $matches = preg_grep("/^(www)?$location$/", $blocked);
    if (empty($matches)) {
        return false;
    } else {
        return true;
    }
}

print isBlocked('play.google.com'); // 1
print isBlocked('www.google.com'); // 1
print isBlocked('google.com'); // 1
print isBlocked('stackoverflow.com');  // 0

我觉得匹配是向后的,因为它是多对一的,其中一个匹配堆栈中任何一个(子)部分。因此,在这种情况下,我们可以使用
strpos()
(代替正则表达式):

函数查找反向匹配($needle,$haystack){
$i=0;
$c=计数($haystack);
而($i<$c){
if(strpos($needle,$haystack[$i++])!==false){
返回true;
}
}
返回false;
}

没有php函数只替换字符串中的第一个匹配项,因此preg_replace()和in_array()将执行以下操作:

$blocked = array(
    'www.google.com',
    'yahoo.com'
);

var_dump( in_array( preg_replace( '/^www\./', '', 'google.com' ), preg_replace( '/^www\./', '', $blocked ) ) ); // true
var_dump( in_array( preg_replace( '/^www\./', '', 'www.yahoo.com' ), preg_replace( '/^www\./', '', $blocked ) ) );  // true
var_dump( in_array( preg_replace( '/^www\./', '', 'www.facebook.com' ), preg_replace( '/^www\./', '', $blocked ) ) );   // false

是否允许任何站点使用域中的任何子域?如果是这样,那么只需取下并仅使用域和TLD部分。如果没有,那么应该添加允许的子域。您也可以创建某种通配符匹配,不过这可能是您的正则表达式url@Jacinto是,将验证筛选器变量。但目的不是验证)@JaredFarrish,感谢linkstr_的替换将是不好的,因为假设是网站我阻止了www.www.com,结果会是。comI采用了一种不同的方法,我反而根据他们的IP阻止了网站。谢谢你的帮助,我当然知道我会怎么做。
function find_reverse_match($needle, $haystack) {
    $i = 0;
    $c = count($haystack);

    while ($i < $c) {
        if (strpos($needle, $haystack[$i++]) !== false) {
            return true;
        }
    }

    return false;
}
$blocked = array(
    'www.google.com',
    'yahoo.com'
);

var_dump( in_array( preg_replace( '/^www\./', '', 'google.com' ), preg_replace( '/^www\./', '', $blocked ) ) ); // true
var_dump( in_array( preg_replace( '/^www\./', '', 'www.yahoo.com' ), preg_replace( '/^www\./', '', $blocked ) ) );  // true
var_dump( in_array( preg_replace( '/^www\./', '', 'www.facebook.com' ), preg_replace( '/^www\./', '', $blocked ) ) );   // false