感谢您抽出宝贵的时间阅读本文,对于每一个答复,无论内容的质量如何,我将不胜感激。 :)
我正在尝试创建一个php脚本,该脚本在文本文件中搜索特定的文本。一个人输入HTML表单中的特定文本,然后php脚本应在文本文件中搜索该特定文本。
HTML表单的输入字段的值为“ username”,在php文档中,变量“ $ username”是输入的数据,示例如下所示:

$username = $_POST['username'];

下面的文本文件称为“ begin.txt”:

“ AULLAH1”“ 2010/01/07 15:28”“ 55621454”“ 123456”“ 123456.00”
“ USERNAME”“ 2010/7/3下午6:21”“ 55621454”“ 123456”“ 123456.00”
“ AULLAH1”“ 07/07/2010 15:05”“ 55621454”“ 189450”“ 123456.00”
“ SUPREMEGAMER”“ 2010/7/8下午6:42”“ 55621454”“ 123456”“ 123456.00”

如果某人键入HTML格式的“ AULLAH1”,我希望php脚本抓取文本文件中的最后一个“ AULLAH1”条目(例如,它应抓取第三行而不是第一行,因为第三行是最后一个包含文本“ AULLAH1”的条目)。同样,当一个人输入特定的文本时,它不应简单地抓住文档或文本,而应抓住整行:“ AULLAH1”“ 07/07/2010 15:05”“ 55621454”“ 189450 “” 123456.00“并将其放入php变量中,也许像“ $ grabbed”?如果可能的话。
感谢您的协助,我们期待您的答复;谢谢。 :)如果我的解释不清楚,和/或您想让我详细解释,请回复。 :)
谢谢。

最佳答案

您可以使用SplFileObject并逐行遍历文件。

请注意,遍历文件比使用file()file_get_contents()具有更高的内存效率,因为它不会将整个文件内容读入数组或变量中。

$username = 'AULLAH1';
$file = new SplFileObject("data.csv");
$grabbed = FALSE;
while (!$file->eof()) {
     $data = $file->fgetcsv(' ');
     if($data[0] === $username) {
         $grabbed = $file->current();
     }
}
echo $grabbed;


由于fgetcsv()在解析该行时会考虑定界符,括弧和转义符,因此它并不是十分快。如果您必须以这种方式解析几百行或几千行,请确保您确实有此需要。



一种替代方法是仅检查当前行是否在某处包含用户名字符串。在问题中显示的文件格式中,这是可行的,因为其余字段包含数字,因此不能有任何误报:

$username = 'AULLAH1';
$file = new SplFileObject("data.txt");
$grabbed = FALSE;
foreach($file as $line) {
    if(strpos($line, $username) !== FALSE) {
        $grabbed = $line;
    }
}
echo $grabbed;


如果要确保在位置1找到$ username,请更改if条件以测试=== 1



如果出于某种原因,如果您希望所有行都包含用户名,则可以编写一个自定义FilterIterator来遍历文件内容,例如

class UsernameFilter extends FilterIterator
{
    protected $_username;
    public function __construct(Iterator $iterator, $username)
    {
        $this->_username = $username;
        parent::__construct($iterator);
    }
    public function accept()
    {
        return strpos($this->current(), $this->_username) !== FALSE;
    }
}


然后,您可以简单地使用foreach。 FilterIterator将每一行传递给accept(),并且仅实际使用为其返回TRUE的那些行。

$filteredLines = new UsernameFilter(new SplFileObject('data.txt'), 'AULLAH1');
foreach($filteredLines as $line) {
    echo $line;
}


以上将输出

"AULLAH1" "01/07/2010 15:28 " "55621454" "123456" "123456.00"
"AULLAH1" "07/07/2010 15:05 " "55621454" "189450" "123456.00"


如果您希望将这些行排列成数组,则可以

$lines = iterator_to_array($filteredLines);


并看最后一个项目

echo end($lines);

10-08 18:55