如何使用 php 搜索 txt 文件的特定行

How to search in particular lines of txt file with php

提问人:john 提问时间:11/19/2020 最后编辑:john 更新时间:11/19/2020 访问量:50

问:

我将文章中的数据存储在 .txt 文件中。 txt 文件如下所示:

id_20201010120010                           // id of article
Sport                                       // category of article
data/uploads/image-1602324010_resized.jpg   // image of article
Champions League                          // title of article
Nunc porttitor ut augue sit amet maximus... // content of the article 
2020-10-10 12:00                            // date article 
John                                        // author of article
oPXWlZp+op7B0+/v5Y9khQ==                    // encrypted email of author
football,soccer                             // tags of article
true                                        // boolean (SHOULD BE IGNORED WHEN SEARCHING)
false                                       // boolean (SHOULD BE IGNORED WHEN SEARCHING)

要在文章中搜索,请使用下面的代码:

$searchthis = strtolower('Nunc');
$searchmatches = [];
    
foreach($articles as $article) { // Loop through all the articles
    $handle = @fopen($article, "r");
    if ($handle) {
        while (!feof($handle)) {
            $buffer = fgets($handle);
            if(strpos(strtolower($buffer), $searchthis) !== FALSE) { // strtolower; search word not case sensitive
                $searchmatches[] = $article; // array of articles with search matches                   
            }
            
        }
        fclose($handle);
    }
}

//show results:
if(empty($searchmatches)) { // if empty array
    echo 'no match found';
}
print_r($searchmatches);

这一切正常!但是当搜索一个词时,他几乎找到了所有的文章,因为在所有文章中,最后一行都有 2 个布尔值。那么我怎样才能跳过 txt 文件的最后 2 行搜索呢?true

PHP 数组 文件 搜索 feof

评论

0赞 Patrick Janser 11/19/2020
我可能和尼克同时写了一个答案!StackOverflow 总是存在同样的问题。但是,将所有文章都放在数据库中不是更有效率吗?也许这些文件是一个历史性的选择。但这并不是为了将它们推送到数据库中。我认为如果您以后必须添加或更改某些属性,那会容易得多。

答:

2赞 Nick 11/19/2020 #1

一种方法是使用 file 将整个文件读入数组,然后array_slice从数组中剥离最后两个元素。然后,您可以循环访问数组以查找搜索值。请注意,您可以使用 stripos 执行不区分大小写的搜索:

foreach ($articles as $article) {
    $data = file($article);
    if ($data === false) continue;
    $data = array_slice($data, 0, -2);
    $search = 'league';
    foreach ($data as $value) {
        if (stripos($value, $search) !== false) {
            $searchmatches[] = $article;
        }
    }
}
2赞 Patrick Janser 11/19/2020 #2

要读取您的文件,而不是像某些 C 代码那样使用 、 等,只需使用该函数即可。它将读取所有文件并将其放在行数组中。然后选择要进行搜索的行。fopenfgetsfile()

<?php

$article = file('article-20201010120010.txt');

// Access each information of the article you need directly.
$id       = $article[0];
$category = $article[1];
// etc...

// Or do it like this with the list() operator of PHP:
list($id, $category, $image, $title, $content, $date, $author, $email_encrypted, $tags, $option_1, $option_2) = $article;

// Now do the insensitive seach in the desired fields.
$search = 'porttitor'; // or whatever typed.

if (($pos = stripos($content, $search)) !== false) {
    print "Found $search at position $pos\n";
} else {
    print "$search not found!\n";
}