search/replace - aber wie?
theresa
- php
hallo forum,
ich möchte alle bildpfade innerhalb eines dokumentes via search/replace ersetzen, hab aber keine idee wie ich das machen soll. ich muss nämlich nicht nur den pfad ändern, sondern auch den dateinamen eines bildes.
ich hab z.b. im original:
<img src = "../bilder/21312312_gans.jpg"> und <img src = "../bilder/9821374_henne.jpg">
und daraus soll werden:
<img src = "http://www.domain.de/bilder/gans.jpg"> und <img src = "http://www.domain.de/bilder/henne.jpg">
mit ereg_replace kann ich den basispfad tauschen, aber wie soll ich die dateinamen ändern?
bin dankbar für jede hilfe. danke!!!
eure theresa
Hello,
bin dankbar für jede hilfe. danke!!!
ich empfehle in solchen Fällen immer sich an der eigenen Arbeitsweise zu orientieren und sich zu überlegen, was man selbst macht.
->
MfG
Rouven
hi rouven,
hmm so hab ich mir das auch vorgestellt.
aber wie funktioniert das mit mehreren dateien?
in einem string kann beliebig oft was zu ersetzen sein, wie identifiziere ich den ganzen bereich den ich ersetzen will?
ich weiß nicht wie ich den bereich von / bis _ identifizieren
kann...
das ist kein problem:
$string = ereg_replace("originalpfad","neuerpfad",$string);
aber wie solls dann weitergehen mit allem was nach neuerpfad kommt?
lg,
theresa
Hello,
ich weiß nicht wie ich den bereich von / bis _ identifizieren
kann...
...indem du mit strrpos das letzte Vorkommen von "/" ermittelst und diese Position anschließend als Startposition an strpos (3. Parameter) verfütterst.
MfG
Rouven
hi rouven,
ich habs jetzt geschafft, meinen startpunkt und meinen endpunkt zu finden. icheh verzweifle jedoch daran, das stück zwischen $start und $ende zu löschen bzw. mit '' zu ersetzen...
folgendes macht aus
ALT: <img src="../bilder/vxdco2be_gans.jpg"
NEU: <img src="../bilder/vxdco2be_TESTgans.jpg"
CODE: echo substr_replace($string,'TEST', $ende, 0);
mit
echo substr_replace($string,'', $ende, -9);
wird einfach ab dem _ abgebrochen, und der restliche teil von $string gelöscht.
ich versteh das nicht, was mach ich falsch?
danke !!!! ;*
Hello,
echo substr_replace($string,'', $ende, -9);
davon mal abgesehen, dass die RegExp Lösungen der anderen das ganze in einer einzigen Zeile erledigen können, warum möchtest du unbedingt replace benutzen um etwas zu entfernen? Nimm einfach den Substring - in Pseudocode:
neu = substr(original, 0, position des /) + (substring, original, position des _ + 1, ende)
MfG
Rouven
hi,
ich verstehe den anderen lösungsweg nicht im geringsten...
und deinen pseudocode versteh ich auch nicht.
kannst du das mal genauer ausführen?
ich versteh das nicht mehr...
lg, theresa
Hello,
und deinen pseudocode versteh ich auch nicht.
kannst du das mal genauer ausführen?
ich versteh das nicht mehr...
also nochmal:
$pos_slash = strrpos($original, "/");
$pos_underscore = strpos($original, "_", $pos_slash);
\--> Nun hast du die letzte Position von / und die dahinterliegend erste Position von \_
3)
~~~php
$ersetzt = substr($original, 0, $pos_slash) + substr($original, $pos_underscore+1);
Anmerkungen: Wenn du nicht sicherstellen kannst, dass jede Datei die entsprechende Namenskonvention erfüllt, dann musst du zu gegebener Zeit noch prüfen, ob $pos_slash und $pos_underscore tatsächlich existiert.
MfG
Rouven
Hallo Theresa,
Die Datei theresa_input.txt sieht so aus:
../bilder/21312312_gans.jpg
../bilder/9821374_henne.jpg
Die Datei theresa.pl sieht so aus:
#!/usr/bin/perl
$file = './theresa_input.txt'; # Name the file
open(INFO, $file);
my @lines = <INFO>;
close(INFO);
foreach (@lines) {
chomp;
s/^../bilder/[0-9]*_/http://www.domain.de/bilder//;
print "$_\n";
}
Also, zuerst werden alle Zeilen von theresa_input.txt eingelesen und im Array @lines abgelegt. Danach läuft man durch das array, wobei die aktuelle Zeile in der Variable $_ abgelegt ist. Das störende Leerzeichen wird durch dam chomp-Kommand weggemacht.
Und das Suchen&Ersetzen macht:
^.. -> Escapen von "."
/bilder/ -> Escapen von "/"
[0-9]* -> mindestens ein Zeichen aus der Menge 0...9
Suche nach allem, was mit "../bilder/mindestens_einmal_0_bis_9_gefolgt_von_unterstrich und ersetze dies durch
http://www.domain.de/bilder. Alles was nach dem Unterstrich im Such-Teil kommt, lasse unverändert.
Die Punkte und die "/" müssen beim URL aus wieder escaped werden.
Und mit print wird das veränderte $_ wieder ausgegeben.
Das Ganze ist ein perl-Skript. Aber da Perl und PHP verwandt ist, müßte es funktionieren. Ggf. anpassen. Aber Hauptsache, Du hast das Prinzip verstanden.
Gruß
Hans
Moin!
Och kann kein php, aber der Suchausdruck sollte sein:
~^../(.*)/\d+?_([^/]+)$~
und der Ersetzausdruck
"http://www.domain.de/$1/$2"
Hoffe, das hilft
-- Skeeve
Hallo theresa,
ich möchte alle bildpfade innerhalb eines dokumentes via search/replace ersetzen, hab aber keine idee wie ich das machen soll. ich muss nämlich nicht nur den pfad ändern, sondern auch den dateinamen eines bildes.
ich hab z.b. im original:
<img src = "../bilder/21312312_gans.jpg"> und
und daraus soll werden:
<img src = "http://www.domain.de/bilder/gans.jpg"> und <img src = "http://www.domain.de/bilder/henne.jpg">mit ereg_replace kann ich den basispfad tauschen, aber wie soll ich die dateinamen ändern?
Ich würde für sowas besser preg_replace() benutzen. Es funktioniert so ähnlich wie ereg_replace() benutzt aber eine etwas andere Art von Regulären Ausdrücken für die Suchmuster. Nebenbei ist es schneller.
// beispiel
$alt = '<img src = "../bilder/21312312_gans.jpg"> <img src = "../bilder/9821374_henne.jpg">';
$rx = '/(\<img[^>]+src\s*=\s*")(\.\.)(\/[^"]+\/)(\d+\_)([^"]+"[^>]*\>)/';
$rpl = '$1http://www.domain.de$3$5';
$neu = preg_replace($rx, $rpl, $alt);
printf('%s', htmlspecialchars($neu));
'/)(\d+\_)([^"]+"'
Das Script geht davon aus, dass der Dateiname der Teil der Zeichenkette ist, der innerhalb des Pfades nach dem letzten Slash steht.
'(<img[^>]+src\s*=\s*")'...'([^"]+"[^>]*>)'
Der Pfad wiederum ist der Teil der Zeichenkette, der innerhalb des <img>-Tags im src-Attribut zwischen den doppelten Hochkommas steht.
'(\d+\_)'
Der Dateiname wird so geändert, dass die führenden Zahlen und der darauffolgende Unterstrich entfernt werden.
MffG
EisFuX