PHP sscanf模式匹配无法按预期工作

时间:2017-01-12 10:56:59

标签: php file-io scanf

所以我已经删除了带有格式化信息的文件,所以有几个文件包含这种格式的多行: ID |出访|资讯|名

当我运行以下代码时,$ id和$ visits正确匹配,只有$ 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>";
       }
   }
}
?>

2 个答案:

答案 0 :(得分:1)

$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以继续使用以下分隔符。当你有某些分隔符时,数字可以很容易地读取但不容易被字符串读取,因为字符串是从数字到任何字符的所有字符,包括除import {Idle, DEFAULT_INTERRUPTSOURCES} from '@ng-idle/core'; export class AppComponent { constructor( private idle:Idle) { idle.setIdle(21600); idle.setTimeout(1); idle.setInterrupts(DEFAULT_INTERRUPTSOURCES); idle.onTimeout.subscribe(() => { this.logout(); }); }; 之外的分隔符,因为它是保留的分隔符。

在这里,您需要使用正则表达式来设置某些条件以匹配您想要的条件并将其提取到变量。

希望它有所帮助!

答案 1 :(得分:0)

创建此问题的分隔符很少,例如:'。''|'

您必须使用其他分隔符才能使其正确。 供参考:http://php.net/manual/en/function.sscanf.php#81842