正则表达式以匹配IP地址

时间:2016-05-18 08:49:20

标签: php regex preg-grep

我有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

3 个答案:

答案 0 :(得分:2)

您可以使用

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

请参阅regex demo

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

更新

如果您需要创建一个带有文字字符串的动态正则表达式,您应该考虑使用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?)。

答案 1 :(得分:1)

解决方案是:

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

答案 2 :(得分:0)

如果您想要捕获任何其他IP,您可以更改$ search。

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