PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : php: Bestimmte Textteile in einem File ersetzen



berny
19.10.2010, 18:14
Hi Leute
Stehe wieder mal vor einer kleinen Aufgabe:

Wie kann ich auf einfache Weise in einem Textfile folgenden Code mittels script durch nachfolgenden Code ersetzen:

$action = array(
"do1"=>"eins",
"do2"=>"zwei",
"do3"=>"drei"
);

$action = array(
"do1"=>"elf",
"do2"=>"zwölf",
"do3"=>"dreizehn"
);

Wobei es mir darum geht, nur die Änderungen zu ersetzen, nicht den kompletten Text.
Dies deshalb, weil es letztlich nur um die Änderung zwischen den Klammern geht, es kann ja sein, dass der Aufbau des Files auch anders ist, dieser Array kommt aber immer wieder vor.

Hat da jemand auf die Schnelle eine Idee ?

thx

KlausK
19.10.2010, 18:42
Spontan fällt mir VBA (Excel) ein. Umbenennen von Dateien, ersetzen von Texten, lässt sich damit schnell realisieren.
Vorallem wenn es um tausende Dateien geht. Mit "MacroX" lassen sich auch große Mengen bewältigen!

berny
19.10.2010, 19:58
Ähm.....

mittels script
Muß also ergänzen:
mittels php-script.

Die Idee dahinter ist das direkte Online-Editieren bestimmter Files mittels webbasiertem Formular.

Letztlich muß ich den Inhalt des arrays ändern, dies aber direkt in das file schreiben.
Das Problem kann sein, dass der Array nicht immer an der gleichen Stelle steht, oder dass die Reihenfolge der array-Definitonen nicht gleich ist...

Freelancer
19.10.2010, 20:17
Kannst du ein bisschen mehr Details schreiben?
Aber die Suche nach gewissen Worten ist kein Problem und das ersetzen dieser Worte ist genauso kein Problem, aber es ist schwer ein Script zu bauen, wenn man nicht ganz das Beispiel versteht :)

berny
19.10.2010, 20:42
Naja:
es sind verschiedene php-files.
Darin stehen alle möglichen codes, und unter anderem ein array, in dem wie oben beschrieben Keys und Values definiert werden.

Diese php-Files gilt es zu editieren, wobei ich einfach die entsprechenden keys und values manuel ändern möchte.
wie oben beschrieben, zB beim key do1 das value eins auf elf umändern.

Somit steht in diesem php-File hardgecodet ein anderer Wert drinnen.

Es wäre leicht, wenn alle files den gleichen Aufbau hätten, aber das ist nicht so, bei einem File kann der array in der Zeile 1 stehen, beim anderern erst in Zeile 5
ebenso könnte es sein, dass bei einem File der array einfach in einer Zeile steht, bei einem anderen wiederum in verschiedenen Zeilen.
Also nach Zeilen zu arbeiten macht keinen Sinn.

Ich muß eben den Array (diese Zeilen sozusagen)finden, zerlegen, die Werte zuweisen, dann wieder zusammenbauen und in das file schreiben.

Das ganze wäre aber günstig mittels einem Formular zu machen, also der Key = Inputname, Value = Inputvalue.

Stellt sich eben die Frage, wie macht man das am einfachsten...

Freelancer
19.10.2010, 20:49
Kommt der Wert denn nur EINMALIG vor, also kannst du einfach ein "suche & ersetzen" machen, oder kann es sein, dass der Wert an einer anderen Stelle nochmal steht, da aber erhalten bleiben soll?

Freelancer
19.10.2010, 21:07
Der Code ist ungetestet und bitte VORHER ein Backup anlegen!!

<?php

//Zu aendernte Dateien
$datei_array = ('erste_datei.php',
'zweite_datei.php',
'dritte_datei.php');

//Inhalt je Datei aendern (erste Demission gibt die Datei an, zweite Demission das Wort in der Datei
//dritte Demission gibt an ob es zum Suchen oder zum Ersetzen ist
$inhalt_change[0][0]['suche'] = "erster_alter_wert_erste_datei";
$inhalt_change[0][0]['ersetzen'] = "erster_neuer_wert_erste_datei";
$inhalt_change[0][1]['suche'] = "zweiter_alter_wert_erste_datei";
$inhalt_change[0][1]['ersetzen'] = "zweiter_neuer_wert_erste_datei";
$inhalt_change[0][2]['suche'] = "dritter_alter_wert_erste_datei";
$inhalt_change[0][2]['ersetzen'] = "dritter_neuer_wert_erste_datei";
$inhalt_change[1][0]['suche'] = "erster_alter_wert_zweite_datei";
$inhalt_change[1][0]['ersetzen'] = "erster_neuer_wert_zweite_datei";
$inhalt_change[2][0]['suche'] = "erster_alter_wert_dritte_datei";
$inhalt_change[2][0]['ersetzen'] = "erster_neuer_wert_dritte_datei";

for($i=0; $i<count($datei_array); $i++)
{
//Datei auslesen
$datei_handle = "";
$datei_handle = fopen($datei_array[$i], "w+");

//Werte ersetzen
for($j=0; $j<count($inhalt_change[$i]);$j++)
{
$datei_inhalt = str_replace($inhalt_change[$i][$j]['suche'], $inhalt_change[$i][$j]['ersetzen'], $datei_handle);
}

//Datei wieder speichern
fwrite($datei_handle, $datei_inhalt);
fclose($datei_handle);
}

?>


Es ist in einem 3D Array programmiert! Wenn du die Werte aus einer Datenbank nehmen würdest, könnte man das ganze ein bisschen netter programmieren und den Array sauber aufbauen! Denn der 3D Array ist so etwas "unsauber", aber sollte seinen Dienst tun!

berny
19.10.2010, 21:09
er kommt nur einmal vor.
Es kann aber auch sein, dass zB in einem File der Array aus 4 oder 5 keys besteht, in einem anderen aus 6 oder 7.
Diese werden derzeit ausgelesen und einfach in mehrere Formularfelder (input type=text name=key value=value) eingelesen.
Dort möchte ich dann den Wert value ändern, und dann wieder in die Datei reinschreiben.


Oups, zu spät gesehen....
thx, werde das mal testen und berichten (aber nicht mehr heute ;-) )

Freelancer
19.10.2010, 21:12
Ich habe den Code so aufgebaut, dass die erste Datei 3 Werte hat, die zweite und dritte jeweils nur einen, aber das kannst du ja selber erweitern! Bedenke aber, dass die zu lesende und zu beschreibende Datei einen CMOD Recht von 777 haben MUSS!!!! Wenn du dieses Schreib- und Leserecht nicht vergeben kannst, oder willst, kann man das ganze noch ein bisschen umbauen und du kannst die Datei über einen FTP öffnen und wieder schreiben! (Wird aber nur in den seltensten Fällen gemacht)

berny
19.10.2010, 21:14
Jop, das mit den Schreibrechten ist eh klar ;)
Ansich ist es kein Problem, diese Datein mit 777 anzulegen, auch wenn man darin schreiben kann.
Muß dann eben in den scipt diverse hackerchen abfangen müssen

Freelancer
19.10.2010, 21:20
Von aussen sollte an die Datein eh keiner ran kommen können, da dies der Server abfängt :) und die Richtlinien von PHP unterbinden (in der Standard-Konfiguration).
Probier das Script einfach mal aus und sage mir, ob es funktioniert, oder ob es vielleicht noch nachgebessert werden müsste!

jay-ar
19.10.2010, 22:41
einen CMOD Recht von 777 haben MUSS
Das ist aber ein Graus für jeden Admin. Wer das macht, braucht sich später nicht zu wundern, wenn's mal böse rappelt. Um PHP Dateien zu öffnen wieder zu speichern, benötige ich kein Ausführungsrecht. Ein rw reicht, das wäre eine 6, und nicht rwx was 7 widerspiegelt.
Suchen und ersetzen gehen auf unixoiden(Linux,Mac,BSD,Unixderivate etc.) Systemen mit find, awk, grep, sed, cut, uniq, sort, xargs, head, tail etc. in Verbindung mit Regex recht einfach. Wenn die PHP Funktionen passthru oder exec erlaubt sind, kann man das auch aus einem PHP Script einfach umsetzen. Wenn ein ssh Zugang vorhanden ist, dann sind diese Befehle meist ausführbahr.

Beispiele:
sed -e 's/suchen/ersetzen/g' -i datei

hier nur alle Dateien die auf html enden
find . -name '*html' -exec sed -e 's/suchen/ersetzen/g' -i \{\} \;

Bei sed mit der Option -f kannst Du auch komfortabel eine Scriptdatei anlegen, in der in jeder Zeile eine solche Regel steht und ohne viel Programmierung drum herum.
aufzurufen ist es dann
sed -f sedscriptbefehle datei_zum_aendern

Mit ein wenig Übung klappt das besser als in PHP
jay-ar

PS: Noch ein paar Befehle, um der falschen chmod/chown vorzubeugen
find . -type f -perm 777 ## finde alle 777 Dateien ausgehend von aktuellen Verzeichnis
find . -type f -perm 777 -exec chmod 660 \{\} \; #alle 777 Dateien in 660 ändern. besser wäre allerdings im Shop bei den meisten 400
find . ! -user web15 -exec chown web15\: \{\} \; #finde alles was nicht dem web15 gehört und ändere es ab

Freelancer
19.10.2010, 23:14
Gerade so Funktionen wie exec sollten eigentlich in JEDEM PHP über die php.ini verboten sein! Denn durch diese Funktion kann man dann direkt die Schadsoftware auch noch im Root installieren und bleibt nicht nur auf der Oberfläche!

Razor
20.10.2010, 01:17
Ihr seid aber kompliziert!

file1.php bis file3.php

<?php
echo 'hier komt dein php code';
##hierkommtmeinarray##
echo 'hier komt dein php code';
?>index.php


<?php
$files = array('file1.php','file2.php','file3.php');
$value1="VALUE1"; $value2=null; $value3="VALUE3"; $value4="VALUE4"; $value5=null;
$meinArray ='$action = array( ';
//für FormDaten $_GET oder $_POST verwenden
if (isset($value1)){$meinArray .= '"KEY1" => "'.$value1.'", ';}
if (isset($value2)){$meinArray .= '"KEY2" => "'.$value2.'", ';}
if (isset($value3)){$meinArray .= '"KEY3" => "'.$value3.'", ';}
if (isset($value4)){$meinArray .= '"KEY4" => "'.$value4.'", ';}
if (isset($value5)){$meinArray .= '"KEY5" => "'.$value5.'", ';}
$meinArray=substr($meinArray, 0, -2); $meinArray .= " );";


foreach ($files as $filename){
$inhalt = file_get_contents("source/".$filename);
$mitArray = str_replace('##hierkommtmeinarray##',$meinArray,$i nhalt);
file_put_contents("dest/".$filename,$mitArray);
}
?>und als rar zum testen

30

pass:ecomservice.de

Dieser Source Code unterlieg dem Urheberrecht. Übernahme, Speicherung, Vervielfältigung, Wiedergabe und sonstige Verwendung gleich welcher Art ist - auch Auszugsweise - NICHT ERLAUBT. (c) by eComService.de

berny
20.10.2010, 09:01
wow, ein sehr guter Ansatz.
Jetzt stellt sich nur die Frage, wie kann ich den alten array durch den neuen ersetzen.
es müßte also sowas sein, wie zwischen zwei kommentaren zu ersetzen.
zB
im File:

##hierstartetmeinarray##
$action = array(
do1=>value1,
do2=>value2
);
##hierendetmeinarray##


Damit wäre es dann relativ einfach und auch egal, wie der alte Array ausgesehen hat, weil dann einfach ein neuer geschrieben wird.

Im alten File steht ja dieser array noch drinnen, muß also auch ersetzt werden, sonst gibts mehrere arrays, das wäre dann auch nicht so gut.

jay-ar
20.10.2010, 09:20
Nein, definitiv nicht. In vielen Konfigurationen, so wird das auch gemacht, kann ich PHP sagen, welche Befehle ich ausführen möchte. Bei fcgid z.B. ist das Standardeinstellung. Viele Software der Systemüberwachung auf Webbasis kommen an den Befehlen gar nicht vorbei. Davon mal ab, ist es Schadsoftware meist egal, wo die im System hängt. Wenn der webuser ins System schreiben kann, da hilft auch kein verbieten der Funktionen, dann würde ich am Sicherheitskonzept nachbessern.

jay-ar

PS: Ich durfte mir schon einige komprimittiere Server anschauen/untersuchen. Veraltete Software(mit Lücken) und fehlerhafte Webeinstellung bzw. Rechtevergabe waren meist die Löcher, durch die geschlüpft wurde.

Razor
20.10.2010, 09:21
richtig, du musst den alten array aus den files löschen und durch ##hierkommtmeinarray## ersetzen.
kannst du mir per PM mehr infos zukommen lassen?

Redmen
06.01.2011, 18:52
Hallo Leute, hier noch ein script wo mir Berny geholfen hat (ein megadankeschön an Dich, Berny!!:))

Es soll in einer html datei bestimmte worte finden und diese durch ein anders wort ersetzen und die html datei wieder speichern:




<?php

$debug=1;

$datei = ("datei_zum_bearbeiten.html");

// die datei zum bearbeiten kann z.b. normale html-formatierung haben, z.B:
//<font size=2>name</font>
// wobei "name" dann durch Peter ersetzt wird.

$inhalt_change[0]['suche'] = "name"; // diesen String in der Datei suchen
$inhalt_change[0]['ersetzen'] = "Peter"; // mit diesen String ersetzen

$inhalt_change[1]['suche'] = "nnam";
$inhalt_change[1]['ersetzen'] = "Mustermann";

$inhalt_change[2]['suche'] = "titel";
$inhalt_change[2]['ersetzen'] = "Dr. Prof. of Muster";

$inhalt_change[3]['suche'] = "desc";
$inhalt_change[3]['ersetzen'] = "Leidenschaftlicher Mustermacher";

$inhalt_change[4]['suche'] = "firm";
$inhalt_change[4]['ersetzen'] = "Musterfirma GmbH";

$inhalt_change[5]['suche'] = "strs";
$inhalt_change[5]['ersetzen'] = "Musterstrasse 14";

//$inhalt_change[6]['suche'] = "altes wort";
//$inhalt_change[0][6]['ersetzen'] = "neues wort";

//$inhalt_change[7]['suche'] = "altes wort";
//$inhalt_change[7]['ersetzen'] = "neues wort";

// der Vorgang lässt sich ohne Probleme erweitern

if (is_writable($datei)) {
$contents = file_get_contents($datei);

for($j=0; $j<count($inhalt_change);$j++) {
$contents = str_replace($inhalt_change[$j]['suche'], $inhalt_change[$j]['ersetzen'], $contents);
}
$datei_handle = fopen($datei, "w+");
if (!fputs($datei_handle, $contents)){
echo "Kann die Datei $datei nicht beschreiben";
exit;
}
fclose($datei_handle);

} else {
print "Die Datei $datei ist nicht schreibbar";
}

?>

WalterGestalter
06.01.2011, 19:40
ganz cool. aber wofür braucht man sowas?

berny
07.01.2011, 19:28
naja, wenn du bestimmte Datein auf einfache Weise ändern willst.
geht auch mit anderen Programmen, aber eben auch mit php.

Der Spracheditor des Buttoncreators verwendet sowas zb, aber es könnte auch andere Verwendungsmöglichkeiten geben.
Man muß ja nicht immer alles hinterfragen ;-)

Ach ja, war übrigens eines der "geheimen" Projekte die ja angeblich nicht über PM oder E-Mail abgelaufen sind.
Das Ergebnis zählt, und das passt:cool: