PHP preg_split IPs в строке - PullRequest
       13

PHP preg_split IPs в строке

2 голосов
/ 21 февраля 2011

Я пытаюсь использовать preg_split в PHP, чтобы разбить следующую строку и вернуть мне 2 IP-адреса:

$membersStr = "members { 167.69.27.151:4449 {} 167.69.27.153:4449 {} 167.69.27.154:4449 { session user disabled } 167.67.27.156:4449 }";

Мой код:

$nodesArray = preg_split("/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/", $membersStr, -1, PREG_SPLIT_NO_EMPTY);

затемпросто распечатайте это сейчас:

print_r($nodesArray);

Однако это пустой массив.Я дважды проверил свое регулярное выражение в онлайн-контролере, и он возвращает IP.

Попытка:

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $membersStr, $nodesArray);
echo $nodesArray[0];

Печать:

Array

В моем браузере.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Вам не нужен этот комплекс регулярных выражений здесь.Используйте это регулярное выражение, чтобы вытащить IP-адреса внутри первого набора скобок:

members \{(.*)\}

Возьмите первую группу (что находится в скобках).Затем explode() на {}, чтобы получить каждый IP.Переберите каждое значение, обрежьте его и убедитесь, что оно не пустое.

Редактировать

Попробуйте это:

$membersStr = "members { 167.69.27.151:4449 {} 167.69.27.153:4449 {} }";

$ips = explode("{", $membersStr, 2);
$ips = explode("{}", $ips[1]);

foreach ($ips as $ip){
    $ip = trim($ip);
    if ($ip != "" && $ip != "}")
        echo $ip . "<br/>";
}

ОБРАЗЕЦ ВЫТЯЖЕН ИЗ ФАЙЛА

 members {
      167.69.97.48:4440 {
         session user disabled
      }
      167.69.97.91:4440 {}
   }

Редактировать

Используйте другой ответ, но вот так:

$membersStr = @" members {
      167.69.97.48:4440 {
         session user disabled
      }
      167.69.97.91:4440 {}
   }";

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $membersStr, $nodesArray);

foreach ($nodesArray[0] as $ip)
    echo $ip . "<br/>";
0 голосов
/ 21 февраля 2011

Если вы используете существующее регулярное выражение для разбиения, то соответствующая часть, безусловно, не будет частью списка результатов. Вместо этого вы получите пустое пространство и заполнить вещи между ними.

Поэтому проще, если вы сопоставите и извлечете те части, которые вам действительно нужны:

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $str, $matches);
$list = $matches[0];
...