PHP脚本抓取整行 - php

感谢您抽出宝贵的时间阅读本文,对于每一个答复,无论内容的质量如何,我将不胜感激。 🙂
我正在尝试创建一个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);

PHP:将数组值加在一起 - php

我相信这比标题听起来要难一些,但我可能完全错了。我有一个像这样的数组:[["londrina",15],["cascavel",34],["londrina",23],['tiradentes',34],['tiradentes',21]] 我希望能够采用通用…

PHP JQuery复选框 - php

我有以下片段。 var myData = { video: $("input[name='video[]']:checked").serialize(), sinopse: $("#sinopse").val(), dia: $("#dia").val(), quem: $(&#…

PHP-MySQL结果转换为JSON - php

我试图了解如何将MySQL结果转换为JSON格式,以便以后可以在Javascript中使用此JSON来构建HTML表。但是我的代码只是产生大量的空值,我还不明白为什么。$result = mysqli_query($con, "SELECT * FROM Customers"); $test = json_encode($result);…

PHP Count数组元素 - php

嗨,有人可以解释为什么这会返回“数组由0个元素组成”。 :$arr = array(1,3,5); $count = count($arr); if ($count = 0) { echo "An array is empty."; } else { echo "An array has $count elements.…

PHP:从函数返回值并直接回显它? - php

这可能是一个愚蠢的问题,但是……的PHPfunction get_info() { $something = "test"; return $something; } html<div class="test"><?php echo get_info(); ?></div> 有没有办…