【问题标题】:Regular expression to match IP addresses匹配 IP 地址的正则表达式
【发布时间】:2016-05-18 08:49:20
【问题描述】:

我有 file.txt 包含这些数据:

livebox.home (192.168.1.1)
set-top-box41.home (192.168.1.10)
pc38.home (192.168.1.11)
pc43.home (192.168.1.12)
pc39.home (192.168.1.15)

我想提取pc39.home的IP。我用过这个正则表达式,但它不起作用:

preg_grep("#^[a-z]{2}39.[a-z]{4} \d{3}\.\d{3}\.\d{1}\.\d{2}#",$myfile);

结果应该是192.168.1.15

【问题讨论】:

    标签: php regex preg-grep


    【解决方案1】:

    你可以使用

    preg_match('~^[a-z]{2}39\.[a-z]{4} \(([\d.]+)~m', $myfile_contents, $matches);
    print_r($matches[1]);
    

    regex demo

    我添加了一个\( 来匹配文字(,并在[\d.]+ 周围使用了一个捕获组(1 个或多个数字或点),它匹配可以使用@ 检索的IP 987654326@ 在$matches 中的索引。 ~m 启用多行模式,以便^ 可以匹配行的开头,而不仅仅是字符串开头。

    更新

    如果你需要创建一个包含文字字符串的动态正则表达式,你应该考虑使用preg_quote

    $myfile = file('file.txt');
    $search = "pc39.home";           // <= a literal string, no pattern
    foreach ($myfile as $lineContent)
    {
         $lines=preg_match('/' . preg_quote($search, "/") . ' \(([\d.]+)\)/', $lineContent, $out);
         echo($out[1]);
    }
    

    您还需要在 ' \(([\d.]+)\)/' 中使用单引号文字,因为 \ 必须是文字 \ 符号(是的,PHP 将 \ 解析为带有不存在转义序列的文字 \,但为什么要放它到 PHP?)。

    【讨论】:

      【解决方案2】:

      解决办法是:

      $myfile = file('file.txt');
                  $search = "pc39\.home";
                  foreach ($myfile as $lineContent)
                  {
                     $lines=preg_match("/" . $search ." \(([\d.]+)\)/", $lineContent, $out);
                     echo($out[1]);
                  }
      

      【讨论】:

      • 如果你想在正则表达式中使用变量作为文字,你可以使用preg_quote
      【解决方案3】:

      如果您想捕获任何其他 IP,只需更改 $search 即可。

      $search = "pc39\.home";
      preg_match("/" . $search ." \(([\d.]+)\)/", $myfile, $out);
      

      【讨论】:

        猜你喜欢
        • 2012-04-27
        • 2011-08-17
        • 2011-08-27
        • 2012-05-17
        • 2011-03-01
        • 1970-01-01
        • 2014-05-17
        • 2011-05-12
        • 1970-01-01
        相关资源
        最近更新 更多