я имею 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)
Я хочу извлечь IP pc39.home
, Я использовал это регулярное выражение, но оно не работает:
preg_grep("#^[a-z]{2}39.[a-z]{4} \d{3}\.\d{3}\.\d{1}\.\d{2}#",$myfile);
Результат должен быть 192.168.1.15
,
с этим вы можете просто изменить поиск $, если вы хотите захватить любой из других IP-адресов.
$search = "pc39\.home";
preg_match("/" . $search ." \(([\d.]+)\)/", $myfile, $out);
Ты можешь использовать
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
включает многострочный режим, чтобы ^
может соответствовать началу строки, а не только началу строки.
ОБНОВИТЬ
Если вам нужно создать динамическое регулярное выражение с литеральной строкой, подумайте об использовании 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 разрешает \
как буквальный \
с несуществующими escape-последовательностями, но зачем помещать это в PHP?).
решение:
$myfile = file('file.txt');
$search = "pc39\.home";
foreach ($myfile as $lineContent)
{
$lines=preg_match("/" . $search ." \(([\d.]+)\)/", $lineContent, $out);
echo($out[1]);
}