【问题标题】:Strings, regexp and files字符串、正则表达式和文件
【发布时间】:2012-09-25 05:51:04
【问题描述】:
<?php 
    $iprange = array( 
        "^12\.34\.", 
        "^12\.35\.", 
        ); 
    foreach($iprange as $var) { 
        if (preg_match($var, $_SERVER['REMOTE_ADDR'])) {

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

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

  1. 我知道我会以某种方式使用数组包含,但我不确定如何实现它。

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

编辑------------

感谢 Mamsaac,非常有帮助,现在我被困在与案例和 ob_file_callback 相关的进一步问题上,如果我在这里开始谈论它们,我将一无所获,但它们可以关注这里:Problems with ob_file_callback and fwrite

至于这里的这个线程,为了保持话题,我想问你如何在你建议的数组中包含整个文件?

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

【问题讨论】:

    标签: php regex string file loops


    【解决方案1】:
        $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 并且效果很好。我还在我的 if else 之前和之后都将两个 '}' 放在了脚本的末尾,但没有运气。

    【讨论】:

      【解决方案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 范围的标准。

      【讨论】:

      • 谢谢,非常有帮助,但是当我尝试应用它时,我遇到了很多问题,我将在下面详细说明
      • Mamsaac,在我检查您的文件名提取之前,我一直在使用您上面的第一个代码,但我无法使用 if else 语句来处理它。也许我误解了 } 的去向,我不确定。我将在下面添加它来解释。
      猜你喜欢
      • 1970-01-01
      • 2016-07-05
      • 2019-04-17
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多