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