我有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
。
答案 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);