Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP读取部分文本文件_Php_Regex_File Io - Fatal编程技术网

使用PHP读取部分文本文件

使用PHP读取部分文本文件,php,regex,file-io,Php,Regex,File Io,我想实现一个平面文件博客系统。我想博客加载一堆文本文件,因为它的文章,文本文件格式如下 { "title": "Hangout with friends", "slug": "handout-with-friends", "date": "06-05-2012", "category": "General", "tag": "Lifestyle, Social", "author": "Someone" } ### Introduction L

我想实现一个平面文件博客系统。我想博客加载一堆文本文件,因为它的文章,文本文件格式如下

{
    "title": "Hangout with friends",
    "slug": "handout-with-friends",
    "date": "06-05-2012",
    "category": "General",
    "tag": "Lifestyle, Social",
    "author": "Someone"
}

### Introduction

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

### Whatever 1

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

### Whatever 2

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
文章文本文件分为两部分,第一部分是元数据,第二部分是内容

加载博客时,我只需要第一部分,这样我就可以为some菜单和文章列表操作一个数组

这就是我现在使用的编码

private function createArticleFromHeader($filelist) {

        $articles = array();

        foreach($filelist as $filename) {
            $header = array();

            $handle = fopen($header_file, 'r');

            $raw = preg_replace("/" . PHP_EOL. "{2,}/", PHP_EOL . PHP_EOL, stream_get_contents($handle));

            $sections = explode( PHP_EOL . PHP_EOL, $raw);

            $meta = json_decode(array_shift($sections), true);

            $articles[] = new Article($meta);
        }

        return $articles;
    }
我在执行这种编码时没有问题,但我正在寻找一个廉价的过程只加载第一部分,而不是加载整个文件,然后像在我的编码中那样分解它,因为博客可能会处理上百篇文章。我不介意我是否必须在文件中添加一些特殊标记,以将其元和内容分开

请提供帮助。

PHP函数设计为从文件句柄一次读取一行。
由于您不介意向文件中添加某些内容,因此如果您放置一个分隔符,如
(或文件中不太可能找到的其他内容),则很容易检测到它

你的例子是:

{
    "title": "Hangout with friends",
    "slug": "handout-with-friends",
    "date": "06-05-2012",
    "category": "General",
    "tag": "Lifestyle, Social",
    "author": "Someone"
}
##########
### Introduction

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
读取它的代码如下所示:

private function createArticleFromHeader($filelist) {

    $articles = array();

    foreach($filelist as $filename) {
        $header = array();

        $handle = fopen($header_file, 'r');
        $raw = "";
        while (($buffer = fgets($handle)) !== false) {
            if (trim($buffer) == "##########") {
                break;
            }
            $raw .= $buffer;
        }
        $raw = preg_replace("/" . PHP_EOL. "{2,}/", PHP_EOL . PHP_EOL, $raw);

        $meta = json_decode($raw, true);

        $articles[] = new Article($meta);
    }

    return $articles;
}

如果您真的希望一次处理这么多的文件句柄,您还应该关闭文件句柄,否则您可能会比预期更快地耗尽内存。

假设您的元数据不跨越一个8192字节的块,您可以使用以下方法:

$meta = json_decode(strtok(
    file_get_contents($filename, false, null, 0, 8192), 
    PHP_EOL . PHP_EOL
), true);
数据库(甚至SQLite)肯定比基于文本文件的解决方案更明智吗?