【问题标题】:PHP sscanf pattern matching not working as expectedPHP sscanf 模式匹配未按预期工作
【发布时间】:2017-01-12 10:56:58
【问题描述】:

所以我有很多带有格式化信息的文件,所以有几个文件包含这种格式的多行: id|visits|info|name

当我运行以下代码时,$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>";
       }
   }
}
?>

【问题讨论】:

    标签: php file-io scanf


    【解决方案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 之外的分隔符,因为这是保留的分隔符。

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

    希望对你有帮助!

    【讨论】:

    • 啊,好的,谢谢!如果我使用空格作为分隔符,这仍然是一个问题吗?
    • 此代码不是故障安全的。它有时会失败,这取决于你的运气。供参考:php.net/manual/en/function.sscanf.php#56076
    • 不。 space 字符不会有问题。由于space 已经是指定用于提取信息的默认分隔符,因此您无需担心这一点。仅当您将自己的分隔符与space 字符分开时,您才需要关心它。希望你明白了!
    【解决方案2】:

    很少有分隔符会导致此问题,例如:'.' 或 '|'

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

    【讨论】:

    • 为什么它与前两个变量一起工作?
    • 因为它们是数字,可以与字符串区分开来。但是您的第三个参数 $info 本身就是一个字符串,这就是为什么会与 | 混淆的原因。
    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2021-08-14
    • 2023-02-22
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多