Problem mit ereg_replace

Kaeschdin

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein Ersetzungsproblem.

Es gibt vier Dokumente: Im ersten rtf-Dokument namens angebot.rtf befinden sich (zwischen viel Text) drei Platzhalter namens Intel, Microsoft und Suse (untereinander stehend).

Dann gibt es drei rtf-Dokumente, deren Inhalt die Platzhalter ersetzen soll (also das TB_intel.rtf den Intel-Platzhalter etc.).

Ich poste hier mal als Beispiel den Code für die Ersetzung des Intel-Platzhalters:

PHP:
$datei = 'angebot.rtf';
$quelle = file_get_contents("TB_Intel.rtf");
$ziel = file_get_contents("angebot.rtf");
$sNewContent  = ereg_replace("Intel", $quelle, $ziel);
$iFileHandler = fopen("angebot.rtf", "wb");
fputs($iFileHandler, $sNewContent);
fclose($iFileHandler);

Nun will ich beispielsweise nacheinander die drei Platzhalter ersetzen. Das Problem: Mit den Platzhaltern Intel, Microsoft und Suse klappt das. ABER: Da nach der Ersetzung des Intel-Platzhalters in dem eingefügten Text das Wort "Microsoft" vorkommen kann, wird dieses beim nächsten Schritt ja auch durch den Microsoft-Text ersetzt. Das soll nicht sein. Deshalb habe ich die Platzhalter anders benannt (mit % davor und dahinter, nur davor, nur dahinter, TB vor den Platzhaltern etc.). Doch dann wird NIE der erste Platzhalter ersetzt. Nummer zwei und drei funktionieren problemlos, aber am Ende steht der erste Platzhalter noch immer im Dokument.

Ich hoffe, ihr konntet folgen. Ich weiß einfach nicht weiter :(

Könnt ihr mir helfen?

Kerstin
 
Hallo,

Wichtig ist es die Platzhalter eindeutig zu benennen, aber das hast Du ja schon durch die % Zeichen getan.

Nur ist es jetzt da Du den genauen Wortlaut aller drei Platzhalter kennst mit der Funktion str_replace zu arbeiten. Die ist 1. etwas schneller und 2. brauchst Du kein Pattern.

PHP:
$template = file_get_contents('angebot.rtf');
$replacer = array('%INTEL%','%MICROSOFT%','%SUSE%');
$subjects = array(file_get_contents('tb_intel.rtf'),file_get_contents('tb_microsoft.rtf'),file_get_contents('tb_suse.rtf'))
$template = str_replace($replacer,$subjects,$template);
if($fh = fopen('angebot.rtf',"wb"))
{
    fwrite($fh,$template);
    fclose($fh);
}else{
    die('Kann Datei nicht zum Schreiben öffnen');
}
 
Danke für Deine Hilfe, Danilo.

Erst hat Dein Skript nicht funktioniert, aber dann hab ich das fehlende Semikolon gesetzt und es klappte.

Allerdings erzeugt das Skript folgendes Problem: Die angebot.rtf sowie die drei Platzhalter-Dateien enthalten formatierten Text. Wenn ich Dein Skript ausführe, zerschießt es mir bestimmte Word-Formatierungen im Original-Text der angebot.rtf. Außerdem geht die Formatierung der Intel-Platzhalterdatei verloren (hab jetzt alles in Times New Roman).

Den Effekt habe ich auch, wenn ich Intel, Microsoft und Suse verwende (quasi so, wie ich es zuvor in meinem Skript hatte). Allerdings lässt das Skript dann die Formatierungen der Originaldatei wie sie sind und formatiert "nur" den Intel-Teil in Times. Wenn ich %Intel% usw. schreibe, werden die Platzhalter nicht ersetzt :(

Mal abgesehen von diesem Formatierungsproblem folgende Frage: Ich hatte es vorher so, dass der User sich vor dem Ersetzen in einem Pulldown-Menü aussuchen konnte, welchen Platzhalter er ersetzen möchte und nach dem Ersetzen entscheiden konnte, ob er noch weitere Platzhalter ersetzen möchte. Das wäre bei deinem Skript ja überflüssig, weil alle Platzhalter auf einmal ersetzt werden würden. Angenommen, in der angebot.rtf steht jetzt nur der Platzhalter Intel. Wie kann ich dem User nach dem Prozess mitteilen, dass der Platzhalter Intel ersetzt wurde (damit er vielleicht sieht: "Oh, ich wollte Microsoft auch ersetzt haben. Da hab ich wohl vergessen, den Platzhalter reinzuschreiben.")?

Danke nochmal!

Kerstin
 
Zuletzt bearbeitet:
So,

das Problem mit der Formatierung hab ich jetzt in den Griff bekommen. Es ist zwar keine optimale, aber eine brauchbare Lösung.

Weiß jemand eine Antwort auf mein oben geschildertes Problem mit der Ausgabe der ersetzten Platzhalter? Zusätzlich/Alternativ wäre es auch schön, wenn der User vor der Ersetzung eine Ausgabe bekäme, welche Platzhalter das Skript entdeckt hat.

Ich versuch mich parallel an der Lösung, aber vielleicht kann mir trotzdem jemand helfen :)

Danke,

Kerstin
 
Zurück