【问题标题】:Check if website is in the blocked list检查网站是否在阻止列表中
【发布时间】:2015-03-20 22:28:23
【问题描述】:

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

它遍历$_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;
          }
     }
}

这很好用,例如,当“google.com”在列表中并且输入是“www.google.com”时,问题就出现了,它将返回 false。这很明显,因为我使用了相同的运算符 ===

问题如下:PHP 中除了url_encodeurl_decode 之外,还有什么函数可以处理URLS?我显然可以创建一个正则表达式,但如果有其他方法,请告诉我。

提前致谢。

【问题讨论】:

  • 是否允许任何站点的域中的任何子域?如果是这样,那么只需取消并仅使用域和 TLD 部分。如果没有,那么您应该添加允许的子域。您也可以创建某种通配符匹配,但这可能是您的正则表达式。
  • 我知道 filter_var($string, FILTER_VALIDATE_URL) 验证字符串是否是有效的 url
  • @Jacinto 是 filter_var 将验证。但目标不验证)
  • @JaredFarrish,感谢您的链接

标签: php regex oop url


【解决方案1】:

我突然想到匹配是向后的,因为它是多对一的,其中一个匹配堆栈中 any 的(子)部分。因此,在这种情况下,我们可以使用 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

【讨论】:

  • 我采用了不同的方法,而是根据他们的 IP 阻止网站。感谢您的帮助,当然提供了更多关于我将如何做到这一点的知识。
【解决方案2】:

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

    我只是举个例子: 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
    

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

    【讨论】:

      【解决方案4】:

      你可以用字符串替换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;
           }
      }
      

      伪代码。

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

      也许用

      parse_url
      

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

      【讨论】:

      • str_replace 不好,因为可以说被阻止的网站是 www.www.com 结果将是 .com
      猜你喜欢
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2016-03-01
      • 2018-08-05
      • 2017-06-21
      • 2013-05-22
      • 2015-05-26
      相关资源
      最近更新 更多