我知道如何搜索,打开和检查是否有文件包含字符串“ test”,但是我一生无法弄清楚如何确定行号,其中“测试”。 (或者,如果有多个实例,它首先存在的位置。)
之所以需要它,是因为我最终将Notepad ++的搜索功能和Windows的糟糕搜索功能结合在一起浪费了很多时间,而是决定自己制作,专门为我的需求量身定制,使我能够进行搜索我需要一次查看的所有地方的文件名和内容。然后,它仅打开找到的文件,并直接转到右行。如果我可以使用它的话,将节省很多时间。我现在处于最后一步。
答案 0 :(得分:2)
假设文件test.txt
具有以下内容,我们的搜索字符串为abc
:
abc
def
abc xyz
xyaabcdeejwgrf
如果您想要以下搜索结果,其中abc
甚至可以作为子字符串:
abc was found at line 1
abc was found at line 3
abc was found at line 4
然后我们可以简单地逐行遍历文件行,并保留行号的计数器并打印结果。
<?php
$file_handler = fopen("test.txt","r");
if($file_handler === false){
die("File doesn't exist!");
}
$search_str = "abc";
$line_no = 0;
while(!feof($file_handler)){
$line_no++;
$line = fgets($file_handler);
if(strpos($line,$search_str) !== false) echo "$search_str was found at ",$line_no,PHP_EOL;
}
fclose($file_handler);
如果您希望搜索结果与abc
完全匹配:
abc was found at line 1
abc was found at line 3
然后我们可以在word boundaries \b
的帮助下进行简单的正则表达式匹配。
<?php
$file_handler = fopen("test.txt","r");
if($file_handler === false){
die("File doesn't exist!");
}
$search_str = "abc";
$line_no = 0;
while(!feof($file_handler)){
$line_no++;
$line = fgets($file_handler);
if(preg_match('/\b'.$search_str.'\b/', $line) == 1) echo "$search_str was found at line ",$line_no,PHP_EOL;
}
fclose($file_handler);
如果只希望第一次出现,也可以在while循环中添加break
。