проблема с форматированием scanf - PullRequest
2 голосов
/ 09 марта 2011

У меня есть файл журнала в следующем формате:

INFO 2011-03-09 10:26:15,270 [user] message

Я хочу проанализировать файл журнала, используя PHP:

// assume file exists and all that
$handle = fopen("log_file.txt", "r");
while ($line_data = fscanf($handle, "%s %s %s [%s] %s\n")) {
    var_dump($line_data);
}
fclose($handle);

Когда я запускаю этот код, я получаю:

[0]=>
 array(5) {
   [0]=> string(4) "INFO"
   [1]=> string(10) "2011-03-09"
   [2]=> string(12) "10:26:15,270"
   [3]=> string(5) "user]"
   [4]=> NULL
}
// snip

Похоже, что закрывающая скобка в строке формата ("% s% s% s [% s]% s") нарушает анализ оставшейся части строки.Я проверил документацию PHP для scanf (как предложено fscanf), и я не увидел ничего, что упоминало бы обойти левый квадрат.

Любые предложения о том, как получить 4-й и 5-й элементы ввыглядеть как "пользователь" и "сообщение" соответственно?

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Используйте формат

"%s %s %s [%[^]]] %s\n"

, чтобы 4-й элемент не принимал любой символ ] (конечно, предполагается, что в имени пользователя нет ]).

(Пример использования sscanf: http://ideone.com/lJHYa)


Спецификаторы формата %[abc] заставят функцию читать строку, состоящую только из символов a, b или c. Обратное,%[^xyz] заставит функцию читать строку , а не , имеющую любой из x, y и z.

Следовательно, %[^]] выше будет читать строку доудар ].

0 голосов
/ 09 марта 2011

используйте регулярные выражения ... если вы действительно хотите использовать fscanf, снимите скобку


http://pubs.opengroup.org/onlinepubs/009695399/functions/scanf.html :

Байты в квадратных скобках (список сканирования) составляют набор сканирования

...