file io — PHP sscanf шаблон сопоставления не работает, как ожидалось

Итак, у меня есть множество файлов с форматированной информацией, поэтому несколько файлов содержат несколько строк в этом формате:
ID | визиты | Информация | Название

Когда я запускаю следующий код, $ id и $ посещения совпадают правильно, кажется, что только $ info и $ name имеют какую-то проблему.
$ info содержит все после второго | разделитель.
И $ name пусто.

Я что-то пропустил?

<?php
$dir = new DirectoryIterator('./logs/');
foreach ($dir as $file) {
if (!$file->isDot()) {
$filename = $file->getFilename();
$currentfile = fopen("./logs/$filename","r");
if ($currentfile) {
while (($line = fgets($currentfile)) !== false) {
$n = sscanf($line, "%d|%d|%s|%s", $id,$visits,$info,$name);
print "$name was visited $visits times<br>";
}
fclose($currentfile);
} else {
print "Error: Couldn't open file.<br>";
}
}
}
?>

0

Решение

$dir = new DirectoryIterator('./logs/');
foreach ($dir as $file) {
if (!$file->isDot()) {
$filename = $file->getFilename();
$currentfile = fopen("./logs/{$filename}", "r");
if ($currentfile) {
while (($line = fgets($currentfile)) !== false) {
$n = sscanf($line, "%d|%d|%[^|]|%s", $id, $visits, $info, $name);
print "{$name} was visited {$visits} times<br>";
}
fclose($currentfile);
} else {
print "Error: Couldn't open file.<br>";
}
}
}

Вам нужно заменить %d|%d|%s|%s с %d|%d|%[^|]|%s который также может содержать регулярное выражение. %[^|] читает все символы, кроме |, Поскольку вы ищете строку в третьем разделителе, он принимает все символы, встречающиеся на пути до конца, оставляя следующие разделители для получения пустого литерального значения. Потому что вы используете | поэтому в качестве разделителя необходимо | от чтения в %s перейти к следующим разделителям. Числа могут быть легко прочитаны, но не легко для строки, когда у вас есть определенные разделители, потому что строка — это все от чисел до любых символов, включая разделители, кроме space так как это зарезервированный разделитель.

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

Надеюсь, поможет!

1

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

Есть несколько разделителей, которые создают эту проблему, таких как: » или же ‘|’

Вы должны использовать какой-то другой разделитель, чтобы сделать это правильно.
Для справки: http://php.net/manual/en/function.sscanf.php#81842

0

По вопросам рекламы [email protected]