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

时间:2015-03-20 22:28:23

标签: php regex oop url

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

它遍历$_blocked变量并且compare是找到的输入字符串,它返回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;
          }
     }
}

这非常有效,问题就出现了,例如,让我们说“google.com”在列表中并且输入为“www.google.com”,它将返回false。这是显而易见的,因为我使用相同的运算符===

问题如下:PHP中是否有任何与url_encode&amp; url_decode?我显然可以创建一个正则表达式,但如果有任何其他方法,请告诉我。

提前致谢。

4 个答案:

答案 0 :(得分:2)

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

function find_reverse_match($needle, $haystack) {
    $i = 0;
    $c = count($haystack);

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

    return false;
}

http://codepad.viper-7.com/69ot4O

答案 1 :(得分:1)

我举个例子: Php Search_Array using Wildcard 写了@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

答案是:你应该写正则表达式)

答案 2 :(得分:1)

没有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

答案 3 :(得分:0)

您是否可以将字符串替换为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;
     }
}

Psuedo代码。

NVM。好像你说你可以做表达

也许使用

parse_url

http://php.net/manual/en/function.parse-url.php