2016-06-09 13 views
2
<span class="itemopener">82 top</span>&nbsp;<span class="allopener">all</span> 

Wie kann ich oben zu ändern:Suchen und Ersetzen von Dateien im Verzeichnis

<span class="itemopener">top</span>&nbsp;<span class="allopener">82</span> 

mit PHP auf einer HTML-Datei, die rund 30 dieser HTML-Schnipsel enthält.

Hinweis: 82 kann eine beliebige ganze Zahl über 1

Auch möchte ich von einer neuen Datei dieses Skript auszuführen, das ich in einem Verzeichnis abgelegt werden, die die Suche und ersetzen Sie einmal für jede der 8000 laufen HTML-Dateien in diesem Verzeichnis (das Skript muss, bevor nicht getan timeout - vielleicht ein Feedback.)

+0

Mal sehen, ob ich unde rstand: Sie wollen ein Skript lesen 8000 HTML-Dateien, und suchen Sie eine Zeile und ersetzen Sie sie durch andere in jeder Datei, richtig? –

+0

1 Verzeichnis. 8000 HTM-Dateien. Jede Datei hat einen großen Textblock, wobei ungefähr 30 der Zielschnipsel darin geändert werden müssen. Also ca. 8000 * 30 Ersatz. – Adrian33

+0

hier ist ein Beispiel Seite: http://hackerbra.in/unlisted/best_1360386661.htm – Adrian33

Antwort

1

ich die Funktion bin mit von @Jimmmy erstellt (Bereich d{2} durch d{1,5} ersetzt, weil „Anmerkung: 82 eine ganze Zahl über 1 sein kann“) und hinzugefügt, um die Dateien suchen (getestet und funktioniert gut):

<?php 

function replace($row){ 
    $replaced = preg_replace_callback("~(\<span class=\"itemopener\"\>)(\d{1,5})\s(top\</span\>.*\<span class=\"allopener\"\>).{3}(\</span\>)~iU", function($matches){ 
     $str = $matches[1] . $matches[3] . $matches[2] . $matches[4]; 
     return $str; 
    }, $row); 
    return $replaced; 
} 

foreach (glob("*.html") as $file)   // GET ALL HTML FILES IN DIRECTORY. 
{ $lines = file($file);      // GET WHOLE FILE AS ARRAY OF STRINGS. 
    for ($i = 0; $i < count($lines); $i++) // CHECK ALL LINES IN ARRAY. 
    $lines[ $i ] = replace($lines[ $i ]); // REPLACE PATTERN IF FOUND. 
    file_put_contents($file,$lines);   // SAVE ALL ARRAY IN FILE. 
} 
?> 
+1

danke Jose .. kann das nur in ein paar Stunden überprüfen .. sorry. – Adrian33

+0

gute Arbeit mit ganzen Zahlen, ich habe nicht darüber nachgedacht, wird in meiner Antwort bearbeiten .. – Jimmmy

2

i schrieb Funktion für den Ersatz der Reihe:

function replace($row){ 
    $replaced = preg_replace_callback("~(\<span class=\"itemopener\"\>)(\d{1,5})\s(top\</span\>.*\<span class=\"allopener\"\>).{3}(\</span\>)~iU", function($matches){ 
    $str = $matches[1] . $matches[3] . $matches[2] . $matches[4]; 
    return $str; 
    }, $row); 
    return $replaced; 
} 

$s = '<span class="itemopener">82 top</span>&nbsp;<span class="allopener">all</span>'; 
$replaced = replace($s); 

echo "<pre>" . print_r($replaced, 1) . "</pre>"; 
exit(); 

Working demo of the function

Wenn Sie die Datei nach einer Zeile ablegen und einfach überprüfen möchten, ob die zu ersetzenden Bereiche vorhanden sind, können Sie sie an diese Funktion senden. Aber mit der Anzahl der von Ihnen angegebenen Dateien wird es einige Zeit dauern .

Für das Scannen aller Dateien im Pfad, den Sie meine Antwort dort verwenden können: scandir Nach kleinen Änderungen, die Sie nur HTM-Dateien zu lesen, ändern, und zurück zu Ihnen, welche Struktur Sie wünschen ..

Dann sind Sie nehmen alle gescannten Dateien htm und verarbeiten sie mit etwas wie folgt aus:

$allScannedFiles = array("......"); 
foreach($allScannedFiles as $key => $path){ 
    $file = file_get_contents($path); 
    $lines = explode(PHP_EOL, $file); 
    $modifiedFile = ""; 
    foreach($lines as $line){ 
     if(strpos($line, "span") && strpos($line, "itemopener")){ 
      $line = replace($line); 
     } 
     $modifiedFile .= $line . PHP_EOL; 
    } 
    file_put_contents($path, $modifiedFile); 
} 

ich schrieb dieses ein Ausschnitt aus dem Kopf, so dass einige Tests erforderlich .. Dann ist es laufen, gehen sie machen sich Kaffee und warten:) Wenn es Zeitüberschreitung gibt, können Sie php Zeitüberschreitung erhöhen. Wie das zu tun, wird gebeten, & hier beantwortet: how to increase timeout in php

alternativ können Sie laden Dateien als DOMDocument versuchen und Ersatz für diese Klasse documentation of DomDocument Aber wenn in den Dateien irgendwo nicht gültig html ist, es Probleme verursachen kann ..

+0

thx .. das funktioniert, aber wirklich brauchen eine vollständige Antwort auf alle Dateien zu akzeptieren, aber vielleicht später. – Adrian33

+1

Bearbeitete meine Antwort, so enthält es Hinweis, wie man die ganze Sache macht – Jimmmy

+0

Fast vergessen, danke für die Funktion (+1). –