如何确定文本文件中存在字符串的行号?

时间:2019-11-10 16:00:36

标签: php file

我知道如何搜索,打开和检查是否有文件包含字符串“ test”,但是我一生无法弄清楚如何确定行号,其中“测试”。 (或者,如果有多个实例,它首先存在的位置。)

之所以需要它,是因为我最终将Notepad ++的搜索功能和Windows的糟糕搜索功能结合在一起浪费了很多时间,而是决定自己制作,专门为我的需求量身定制,使我能够进行搜索我需要一次查看的所有地方的文件名和内容。然后,它仅打开找到的文件,并直接转到右行。如果我可以使用它的话,将节省很多时间。我现在处于最后一步。

1 个答案:

答案 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