regex 正则表达式匹配IP地址

nle07wnf  于 2023-11-20  发布在  其他
关注(0)|答案(4)|浏览(148)

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

63lcw9qa

63lcw9qa1#

您可以使用

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

字符串
参见regex demo
我添加了一个\(来匹配文字(,并在[\d.]+(*1个或多个数字或点 *)周围使用了一个捕获组,该捕获组匹配可以使用$matches中的[1]索引检索的IP。~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?)。

mrzz3bfm

mrzz3bfm2#

解决办法是:

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

字符串

carvr3hs

carvr3hs3#

有了这个你可以只改变$搜索,如果你想捕捉任何其他的IP。

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

字符串

pcww981p

pcww981p4#

$fileContent = file_get_contents('anyfile.txt');
$lines = explode("\n", $fileContent);
foreach ($lines as $line) {
    if (strpos($line, 'pc39.home') !== false) {
        $ipStart = strpos($line, '(') + 1;
        $ipEnd = strpos($line, ')');
        $ip = substr($line, $ipStart, $ipEnd - $ipStart);
        echo "IP of pc39.home: " . $ip;
        break;
    }
}

字符串

相关问题