Регулярное выражение для сопоставления IP-адресов

я имею 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,

1

Решение

с этим вы можете просто изменить поиск $, если вы хотите захватить любой из других IP-адресов.

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

Другие решения

Ты можешь использовать

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?).

2

решение:

$myfile = file('file.txt');
$search = "pc39\.home";
foreach ($myfile as $lineContent)
{
$lines=preg_match("/" . $search ." \(([\d.]+)\)/", $lineContent, $out);
echo($out[1]);
}
1
По вопросам рекламы [email protected]