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