【问题标题】:brackets regex php括号正则表达式php
【发布时间】:2013-01-27 22:06:21
【问题描述】:

在 php 中使用正则表达式如何将每个 IP 存储到单独的变量中?

它将从如下所示的日志文件中获取内容。

1/27/2013 7:34:14 AM Removed        {109.104.19.75}
1/27/2013 7:34:16 AM Added          {98.119.183.235}
1/27/2013 7:34:17 AM Removed        {98.119.183.235}
1/27/2013 7:34:34 AM Added          {89.155.107.178}
1/27/2013 7:34:35 AM Removed        {89.155.107.178}

【问题讨论】:

  • 它们是否必须在单独的变量中,为什么不将它们全部存储在一个数组中?
  • 只需遍历日志文件中的行(逐行读取)并使用简单的正则表达式提取 ip。您可以使用迭代计数器作为键来构建一个 ips 数组。为什么要让事情变得更复杂?
  • preg_match_all("/.*{(.*)}.*/", $a, $b);var_dump($b[1]);
  • 这里甚至不需要正则表达式。只需简单的子字符串即可。
  • 感谢farmer1992,这正是我所需要的!

标签: php regex


【解决方案1】:

此脚本读取您的日志文件并将 IP 地址作为数组返回。我建议为此使用数组,因为您可以使用 PHP 比单独的变量更好地处理它:

function readIps($filename, $unique = false) {
    $lines  = file($filename);
    $result = array();

    foreach ($lines as $line) {
        if (preg_match('/\{([^\}]+)\}$/', $line, $matches)) {
            $result[] = $matches[1];
        }
    }

    return $unique ? array_values(array_unique($result)) : $result;
}

此脚本假定,您确定,每行末尾的括号内只列出了 IP 地址。如果不是这种情况,则正则表达式还会匹配 IP 地址以外的其他内容,并且必须更加特殊。

只用你的文件名调用它,你会得到一个包含 IP 列表每次出现的列表,就像它出现的频率一样。将第二个参数设置为true 调用它,您会得到一个列表,其中每个 IP 只出现一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多