2013-11-04 4 views
12

Ich habe eine Anwendung, die die Datei öffnen muss, suchen Sie dann Zeichenfolge darin, und drucken Sie eine Zeilennummer, wo Zeichenfolge gefunden wird.PHP - Finden Sie eine Zeichenfolge in der Datei dann zeigen Sie die Zeilennummer

Zum Beispiel Datei example.txt enthält einige Hashes:

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


Also, ich will für „1e9eea56686511e9052e6578b56ae018“, um PHP-Suche und drucke seine Zeilennummer aus, in diesem Fall 4.

Bitte beachten Sie, dass es nicht mehr Hashes in der Datei sein.

Ich habe ein paar Codes über das Internet gefunden, aber keine scheint zu funktionieren.

habe ich versucht, dieses:

<?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"); 
} 
} 
?> 

Es sagt nur, dass String in Zeile 0 zu finden ist .... was nicht richtig ist ....

Endanwendung ist viel komplexer als das ... Nachdem es Zeilennummer gründet, es Zeichenfolge, die etwas anderes ersetzen sollte, und die Änderungen speichern, die Datei geht dann die weitere Verarbeitung ....

Vielen Dank im Voraus :)

+2

Und Ihre möglichen Versuche? –

+1

Ich habe gerade meinen letzten Versuch hinzugefügt. Danke, dass du mich daran erinnert hast. – xZero

+3

Der Grund, warum Ihr eigener Versuch nicht funktioniert, ist, weil strpos false zurückgibt, wenn die Nadel nicht gefunden wird, was Ihre if-Aussage als wahr auswerten lässt. Sie müssen '! == false 'schreiben, damit eine solche Anweisung funktioniert. –

Antwort

12

Ein ultra-Basislösung könnte sein:

$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; 

Speichersparversion, für größere Dateien:

$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; 
+0

Es funktioniert nicht. Es gibt nichts aus ... Und ja, ich habe versucht, echo $ line_number; Wie auch immer, danke. – xZero

+0

Jetzt funktioniert es wie Charme. Wählen Sie Ihre Antwort am besten, weil ich die Verwendung von file() anstelle von file_get_contents() mag; EDIT: Memory-Saver-Version funktioniert nicht. Die Ausgabe ist leer. – xZero

+0

Jetzt habe ich Speicher-Version versucht, und es funktioniert auch perfekt. Vielen Dank! – xZero

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", "[email protected]"); //return some number or false case not found. 
+1

Sie haben vergessen hinzuzufügen; auf Return-s, so dass es Fehler wirft. Rückgabe $ num + 1; Rückgabe false; Nach der Korrektur funktioniert es gut. Vielen Dank! – xZero

+1

Warnung: Wenn die Datei sehr groß ist, ist der Speicherverbrauch hoch, wenn Sie 'file_get_contents()' und 'explode()' verwenden. – Raptor

+0

Ja, das weiß ich. Aber für jetzt wird es für Dateien bis zu 500kb verwendet werden. Ich bin mir nicht sicher, wie ich den Speicherverbrauch senken kann. – xZero

2

Wenn Sie schnelle und universelle Lösung benötigen, die für die Suche nach Zeilennummer auch Arbeits dies von mehrzeiligen Text in der Datei verwenden:

$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"); 
} 

FYIFunktioniert nur mit PHP 5.3.0+.

+1

Funktioniert auch mit 7.1 und ist sehr schnell und einfach. – INA2N

1
$pattern = '/1e9eea56686511e9052e6578b56ae018/'; 
if (preg_match($pattern, $content, $matches, PREG_OFFSET_CAPTURE)) { 
    //PREG_OFFSET_CAPTURE will add offset of the found string to the array of matches 
    //now get a substring of the offset length and explode it by \n 
    $lineNumber = count(explode("\n", substr($content, 0, $matches[0][1]))); 
} 
0

wollen einige Passanten oder Sucher Vielleicht diesen vorgefertigten Skript verwenden: php-grep

Verwandte Themen