15

ファイルを開いてその中の文字列を見つけ、文字列が見つかった行番号を出力する必要があるアプリケーションがあります。

たとえば、ファイルexample.txtにはいくつかのハッシュが含まれています。

APLF2J51 1a79a4d60de6718e8e5b326e338ae533
EEQJE2YX 66b375b08fc869632935c9e6a9c7f8da O87IGF8R c458fb5edb84c54f4dc42804622aa0c5
APLF2J51
B7TSW1ZE 1e9eea56686511e9052e6578b56ae018
EEQJE2YX affb23b07576b88d1e9fea50719fb3b7


そこで、PHP で "1e9eea56686511e9052e6578b56ae018" を検索し、その行番号 (この場合は 4) を出力します。

ファイルに複数のハッシュがないことに注意してください。

インターネットでいくつかのコードを見つけましたが、どれも機能していないようです。

私はこれを試しました:

<?PHP
$string = "1e9eea56686511e9052e6578b56ae018"; 
$data   = file_get_contents("example.txt"); 
$data   = explode("\n", $data); 
for ($line = 0; $line < count($data); $line++) { 
if (strpos($data[$line], $string) >= 0) { 
die("String $string found at line number: $line"); 
} 
} 
?>

文字列が0行目にあると言っているだけです....これは正しくありません....

最終的なアプリケーションはそれよりもはるかに複雑です...行番号を見つけた後、文字列を別のものに置き換え、変更をファイルに保存してから、さらに処理を進めます....

前もって感謝します :)

4

6 に答える 6

17

超基本的なソリューションは次のとおりです。

$search      = "1e9eea56686511e9052e6578b56ae018";
$lines       = file('example.txt');
$line_number = false;

while (list($key, $line) = each($lines) and !$line_number) {
   $line_number = (strpos($line, $search) !== FALSE) ? $key + 1 : $line_number;
}

echo $line_number;

大きなファイル用のメモリ セーバー バージョン:

$search      = "1e9eea56686511e9052e6578b56ae018";
$line_number = false;

if ($handle = fopen("example.txt", "r")) {
   $count = 0;
   while (($line = fgets($handle, 4096)) !== FALSE and !$line_number) {
      $count++;
      $line_number = (strpos($line, $search) !== FALSE) ? $count : $line_number;
   }
   fclose($handle);
}

echo $line_number;
于 2013-11-04T02:12:20.453 に答える
2

ファイル内の複数行テキストの行番号を見つけるためにも機能する高速で普遍的なソリューションが必要な場合は、これを使用します。

$file_content = file_get_contents('example.txt');

$content_before_string = strstr($file_content, $string, true);

if (false !== $content_before_string) {
    $line = count(explode(PHP_EOL, $content_before_string));
    die("String $string found at line number: $line");
}

参考までに、PHP 5.3.0 以降でのみ動作します

于 2014-06-11T11:46:18.353 に答える
2
function get_line_from_hashes($file, $find){
    $file_content = file_get_contents($file);
    $lines = explode("\n", $file_content);

    foreach($lines as $num => $line){
        $pos = strpos($line, $find);
        if($pos !== false)
            return $num + 1
    }
    return false
}

get_line_from_hashes("arquivo.txt", "asdsadas2e3xe3ceQ@E"); //return some number or false case not found.
于 2013-11-04T02:12:15.440 に答える
0

これはうまく機能し、非常に効率的であることがわかりました。ファイルを各行で展開し、次のように検索語の配列を検索するだけです。

    function getLineNum($haystack, $needle){

        # Our Count
        $c = 1;

        # Turn our file contents/haystack into an array
        $hsarr = explode("\n", $haystack);
        
        # Iterate through each value in the array as $str
        foreach($hsarr as $str){

            # If the current line contains our needle/hash we are looking for it
            # returns the current count.
            if(strstr($str, $needle)) return $c;

            # If not, Keep adding one for every new line.
            $c++;
        }

        # If nothing is found
        if($c >= count($hsarr)) return 'No hash found!';
    }

編集: 他の回答を見ると、Guilherme Soares も同様のアプローチをとっていましたが、この場合は機能しない strpos を使用していることに気付きました。そこで、彼のアイデアを念頭に置いて、いくつかの変更を加えました。

    function getLineNum($haystack, $needle){
        $hsarr = explode(PHP_EOL, $haystack);
        foreach($hsarr as $num => $str) if(strstr($str, $needle)) return $num + 1;
        return 'No hash found!';
    }

ライブデモ: https://ideone.com/J4ftV3

于 2021-02-24T01:41:15.127 に答える
0

ファイルが極端に大きくない場合は、ファイルを配列に読み込みfile、単語を検索し、その行preg_grepのインデックスを取得して、配列が から始まるのでkey追加します。10

$string = "1e9eea56686511e9052e6578b56ae018"; 
echo key(preg_grep("/$string/", file("example.txt"))) + 1;
于 2021-02-23T17:47:00.467 に答える