preg_match多个IP?

时间:2011-12-05 19:25:33

标签: php preg-match

我正在使用preg_match来匹配引用网址AND和IP块。如何告诉我的代码查找引用,如果匹配则检查多个IP块?即:70.x.x.x或96.x.x.x

到目前为止,这是我的代码(适用于一个IP块“70.x.x.x”)

<?php
$referrer = $_SERVER['HTTP_REFERER'];
$visitor = $_SERVER['REMOTE_ADDR'];
if ((preg_match("/referrer-domain.com/",$referrer)) && (!preg_match("/70./",$visitor))){
echo "<meta http-equiv='refresh' content='0;url=http://www.new-domain.com'>";
}
?>

我知道这是一个简单的问题,今天只是放了一个脑屁。

3 个答案:

答案 0 :(得分:3)

您可以使用正则表达式“交替”语法来实现这一点,该语法基本上是一个OR运算符。您还需要使用“^”将表达式锚定到字符串的开头,这将确保您匹配IP的第一个八位字节,并使用反斜杠来转义点,这是正则表达式中的通配符。

此代码段适用于您:

<?php
$referrer = $_SERVER['HTTP_REFERER'];
$visitor = $_SERVER['REMOTE_ADDR'];
if ((preg_match("/referrer-domain.com/",$referrer)) && (!preg_match("/^(?:70|96)\./",$visitor))){
    echo "<meta http-equiv='refresh' content='0;url=http://www.new-domain.com'>";
}
?>

您可能还想考虑使用PHP的header()函数而不是元刷新,即:

if ((preg_match("/referrer-domain.com/",$referrer)) && (!preg_match("/^(?:70|96)\./",$visitor))){
    header("Location: http://www.new-domain.com");
}

答案 1 :(得分:1)

preg_match("/(70|96)./",$visitor)

它也应该是:

preg_match("/^(70|96)\./",$visitor)

或者你也会阻止1.2.96.4和1.2.3.70等。

答案 2 :(得分:1)

另一种可以说是更好的解决方案是使用php的ip2long()函数。

将虚线IP地址转换为整数,您可以使用&gt;进行比较。和&lt;逻辑。

例如

ipstart = sprintf("%u", ip2long('70.0.0.0'));
ipend = sprintf("%u", ip2long('70.255.255.255'));
$visitor = sprintf("%u", ip2long($visitor = $_SERVER['REMOTE_ADDR']));
$referrer = sprintf("%u", ip2long($visitor = $_SERVER['HTTP_REFERER']));

if (($visitor < $ipstart | $visitor < $ipend) | ($referer < $ipstart | $referer < $ipend) ){
     header('location: http://www.new-domain.com');
}

如果$ ipstart和$ ipend是有效IP范围的数组,您可以迭代它们以检查任意数量的不同IP范围。

查看http://php.net/manual/en/function.ip2long.php了解sprintf使用的重要性,以及其他一些需要注意的部分IP地址等等。