Проблема PHP Regex со сложной целевой строкой - PullRequest
0 голосов
/ 16 июля 2009

Мне нужно проанализировать таблицу аренды dhcp с помощью регулярного выражения php. но дело в том, что он содержит и другие символы, используемые в регулярных выражениях.

вот пример вывода

lease 172.17.2.3 {
  starts 4 2009/07/16 11:54:39;
  ends 4 2009/07/16 12:54:39;
  cltt 4 2009/07/16 11:54:39;
  binding state active;
  next binding state free;
  hardware ethernet 00:50:56:c0:00:01;
  uid "\001\000PV\300\000\001";
  client-hostname "Yasin-PC";
}
lease 172.17.2.3 {
  starts 4 2009/07/16 12:24:39;
  ends 4 2009/07/16 13:24:39;
  cltt 4 2009/07/16 12:24:39;
  binding state active;
  next binding state free;
  hardware ethernet 00:50:56:c0:00:01;
  uid "\001\000PV\300\000\001";
  client-hostname "Yasin-PC";
}
lease 172.17.2.3 {
  starts 4 2009/07/16 12:54:39;
  ends 4 2009/07/16 13:54:39;
  cltt 4 2009/07/16 12:54:39;
  binding state active;
  next binding state free;
  hardware ethernet 00:50:56:c0:00:01;
  uid "\001\000PV\300\000\001";
  client-hostname "Yasin-PC";
}

проблема в том, что я хочу назначить всю таблицу в массив, индексированный по ip-адресам после аренды ..XX.XX.XX.XX {... & будут дубликаты ключей, но значения будут другими, поэтому мне нужно решить эту проблему к ...

что бы вы посоветовали мне сэкономить мое время для создания хорошего регулярного выражения для этого? posix или pcre или чтение построчно?

И я не могу быть уверен, что таблица арендных ставок будет в одном формате. может быть, несколько раз еще несколько строк, которые я ожидаю.

Ответы [ 2 ]

1 голос
/ 16 июля 2009

Я думаю, вы могли бы сделать это:

<?php
$order_fields = array('starts', 'ends', 'cltt', 'binding state', 'next binding state', 'hardware ethernet', 'uid', 'client-hostname');
$fields_regexp = '';
foreach ($order_fields as $field)
{
    $fields_regexp .= "\s*".$field." (.*)";
}
$regexp = '/lease (\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b) \{'.$fields_regexp.'\s*\}/m';
preg_match_all($regexp, $string, $result, PREG_PATTERN_ORDER);

$arr = array();
foreach ($result[1] as $i => $match) {
    $cont = count($arr[$match]);
    $arr[$match][$cont]['raw'] = $result[0][$i];
    $arr[$match][$cont]['ip'] = $match;
    foreach ($order_fields as $pos => $field)
    {
        $arr[$match][$cont][$field] = $result[$pos + 2][$i];
    }
}
print_r($arr);
?>

Пример вывода:

Array
(
    [172.17.2.3] => Array
        (
            [0] => Array
                (
                    [raw] => lease 172.17.2.3 {
  starts 4 2009/07/16 11:54:39;
  ends 4 2009/07/16 12:54:39;
  cltt 4 2009/07/16 11:54:39;
  binding state active;
  next binding state free;
  hardware ethernet 00:50:56:c0:00:01;
  uid "�PVÀ�";
  client-hostname "Yasin-PC";
}
                    [ip] => 172.17.2.3
                    [starts] => 4 2009/07/16 11:54:39;
                    [ends] => 4 2009/07/16 12:54:39;
                    [cltt] => 4 2009/07/16 11:54:39;
                    [binding state] => active;
                    [next binding state] => free;
                    [hardware ethernet] => 00:50:56:c0:00:01;
                    [uid] => "�PVÀ�";
                    [client-hostname] => "Yasin-PC";
                )

            [1] => Array
                (
                    [raw] => lease 172.17.2.3 {
  starts 4 2009/07/16 12:24:39;
  ends 4 2009/07/16 13:24:39;
  cltt 4 2009/07/16 12:24:39;
  binding state active;
  next binding state free;
  hardware ethernet 00:50:56:c0:00:01;
  uid "�PVÀ�";
  client-hostname "Yasin-PC";
}
                    [ip] => 172.17.2.3
                    [starts] => 4 2009/07/16 12:24:39;
                    [ends] => 4 2009/07/16 13:24:39;
                    [cltt] => 4 2009/07/16 12:24:39;
                    [binding state] => active;
                    [next binding state] => free;
                    [hardware ethernet] => 00:50:56:c0:00:01;
                    [uid] => "�PVÀ�";
                    [client-hostname] => "Yasin-PC";
                )

            [2] => Array
                (
                    [raw] => lease 172.17.2.3 {
  starts 4 2009/07/16 12:54:39;
  ends 4 2009/07/16 13:54:39;
  cltt 4 2009/07/16 12:54:39;
  binding state active;
  next binding state free;
  hardware ethernet 00:50:56:c0:00:01;
  uid "�PVÀ�";
  client-hostname "Yasin-PC";
}
                    [ip] => 172.17.2.3
                    [starts] => 4 2009/07/16 12:54:39;
                    [ends] => 4 2009/07/16 13:54:39;
                    [cltt] => 4 2009/07/16 12:54:39;
                    [binding state] => active;
                    [next binding state] => free;
                    [hardware ethernet] => 00:50:56:c0:00:01;
                    [uid] => "�PVÀ�";
                    [client-hostname] => "Yasin-PC";
                )

        )

)
0 голосов
/ 16 июля 2009

С таким же успехом можно разобраться. Читайте построчно и сохраняйте текущее состояние в переменных. Когда вы нажимаете на строку с lease ... и не входите в предложение lease, установите $inLease на true и обрабатывайте оставшиеся строки как параметры для текущего lease, пока не нажмете закрывающую скобку } и т. Д.

Регулярные выражения могут помочь вам в этом случае, но не будет сложнее просто выполнить построчный анализ. Учитывая статичность формата данных, регулярные выражения для этого просто излишни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...