字符串,正则表达式和文件

时间:2012-10-04 08:20:16

标签: php regex string file loops

<?php 
    $iprange = array( 
        "^12\.34\.", 
        "^12\.35\.", 
        ); 
    foreach($iprange as $var) { 
        if (preg_match($var, $_SERVER['REMOTE_ADDR'])) {

我希望有一个列表,它将构成数组中的每个值。我们称之为iprange.txt,我将从中提取变量$iprange。我也将使用新范围更新文件,但我也想将这些字符串转换为regexp,如果这是php中需要的东西,就像在上面的例子中一样。

如果您可以帮我解决以下两个问题:

  1. 我明白不知怎的,我会使用数组包含,但我不知道如何实现它。

  2. 我想运行一个cron来更新文本文件并将其转换为可以在上面的示例中使用的正则表达式,如果您认为regexp是一个好主意并且没有其他选项。我知道如何在directadmin gui中应用cron,但我不知道cronned文件的样子。

  3. 编辑------------------------

    感谢Mamsaac,非常有帮助,现在我仍然坚持与案例和ob_file_callback有关的其他问题,如果我在这里开始谈论它们,我将无法获得任何地方,但它们可以是接下来是:Problems with ob_file_callback and fwrite

    至于这个帖子,为了保持主题,我想问你如何在你建议的数组中包含一个完整的文件?

    如果我不需要将字符串转换为正则表达式,我就不再需要你正在考虑的cronjob。

2 个答案:

答案 0 :(得分:2)

如果对你没问题,我会提出一个不同的方法解决问题。

您可以尝试使用ip2long()功能,使比较更快。这样做的好处是你可以对每个范围非常具体(并且以自然的方式,范围意味着“两个数字之间”。

所以,你可以这样做:

$ranges = array('10.20.8.0-10.20.14.254', '192.168.0.2-192.168.0.254');
foreach ($ranges as $iprange) {
    list($lowerip, $highip) = explode('-', $iprange);
    $remoteip = ip2long($_SERVER['REMOTE_ADDR']);
    if (ip2long($lowerip) <= $remoteip && $remoteip <= ip2long($highip)) {
        //it is within this range! I don't know what you want to do with it.
    }
}

您也可以使用网络掩模,但我会将其作为练习留给您。要做到这一点,你将使用按位运算。否定掩码,然后使用和按位和操作...不是你要求的!我睡觉后可能会更新。

关于文件和cronjob。我完全不确定你为什么要这个cronjob。您是如何决定接受新范围的?

您可以随时读取文件(如果您愿意,可以使用file_get_contents,并使用

对字符串进行拆分
$ranges = explode("\n", file_get_contents("filename")) ;

然后你就可以准备你的阵列了。 (注意我甚至称之为与上面的区块代码相同)。 如果文件真的很大,请避免使用上面的方法并继续使用fopen和fgets方法:

$file = @fopen("filename", "r"); //suppressing error messages, probably don't want that
if (!$file) { 
    //for some reason the file didn't open. Do error reporting or checking
}
$ranges = array();
while (($line = fgets($file)) !== false) {
    $ranges[] = $line;
}

似乎我只是想念你为什么要使用cronjob。请详细说明您决定添加新IP范围的标准。

答案 1 :(得分:0)

    $ranges = array('12.34.1.0-12.34.14.254', '192.168.0.2-192.168.0.254');
foreach ($ranges as $iprange) {
    list($lowerip, $highip) = explode('-', $iprange);
    $remoteip = ip2long($_SERVER['REMOTE_ADDR']);

    if (ip2long($lowerip) <= $remoteip && $remoteip <= ip2long($highip)) {
    }
}
    header("LOCATION: page1.php");
    }
else
    {
    header("LOCATION: page2.php");
    }
?>

我已经隔离了if else并且工作正常。我还在你的脚本末尾放置了两个'}',无论是在我之前还是之后,都没有运气。