preg_replace()
heino
- php
hallo!
habe ein problem. ich durchsuche mit preg_replace folgendem string
$string = "<img height=789 alt="" hspace=0 src="irgendwas.jpg" width=257 align=baseline border=0><img height=420 alt="" hspace=0 src="irgendwas2.jpg" width=257 align=baseline border=0>";
jetzt möchte ich dass bei diesem befehl:
$string2 = preg_replace("/height=(.*?) /", $replace, $string);
$replace ein array ist und ich da verschiedene werte reinschreiben kann. also das erste height wird mit "height=300" und das zweite mit dem zweiten $replace-eintrag, also zum beispiel mit "height=290" ersetzt. wenn ich einen normalen array mache, kommt nur irgendein scheiss raus:
IMG 7K7KL7K;KX5=@9Ð6K@7K#alt="" 7K7KL7K;KX5=@9Ð6K@7K#hspace=0 src="http://www.tvzuzwil.ch/test/htmlarea/pics/1.jpg" width=257 align=baseline border=0>
danke für die hilfe...
Hi,
$string2 = preg_replace("/height=(.*?) /", $replace, $string);
dass Du hier das Leerzeichen zwischen height und dem nachfolgenden Attribut ersetzt, ist Dir bewusst. Was steht in $replace?
$string = "<img [...]
IMG [...]
Da Du nirgendwo Klein- durch Großschrift ersetzt, zitierst Du augenscheinlich das Ergebnis einer Fremdinterpretation. Der "Schrott" kann also durchaus von einem anderen Programm kommen. Eliminiere diese Möglichkeit.
7K7KL7K;KX5=@9Ð6K@7K#alt=""
7K7KL7K;KX5=@9Ð6K@7K#hspace=0
Was _genau_ steht in $replace? - Hast Du das überprüft?
Cheatah
Hi,
$string2 = preg_replace("/height=(.*?) /", $replace, $string);
dass Du hier das Leerzeichen zwischen height und dem nachfolgenden Attribut ersetzt, ist Dir bewusst. Was steht in $replace?
ja das ist mir bewusst. ich schreib es auch wieder rein. anders ist es nicht gegangen. (komischerweise)
$string = "<img [...]
IMG [...]Da Du nirgendwo Klein- durch Großschrift ersetzt, zitierst Du augenscheinlich das Ergebnis einer Fremdinterpretation. Der "Schrott" kann also durchaus von einem anderen Programm kommen. Eliminiere diese Möglichkeit.
nein, das ist alles von mir, der schrott entsteht definitiv durch preg_replace.
7K7KL7K;KX5=@9Ð6K@7K#alt=""
7K7KL7K;KX5=@9Ð6K@7K#hspace=0Was _genau_ steht in $replace? - Hast Du das überprüft?
ja hab ich in $replace[0] steht height=500 und in $replace[1] steht height=600
Hi,
dass Du hier das Leerzeichen zwischen height und dem nachfolgenden Attribut ersetzt, ist Dir bewusst. Was steht in $replace?
ja das ist mir bewusst. ich schreib es auch wieder rein. anders ist es nicht gegangen. (komischerweise)
komisch ist das gar nicht - ".*?" nimmt eben die wenigsten zutreffenden Zeichen, auch wenn es keine sind. Etwas wie "\d+" oder "[^ ]+" kann Dir jedoch ebenfalls helfen.
Was _genau_ steht in $replace? - Hast Du das überprüft?
ja hab ich in $replace[0] steht height=500 und in $replace[1] steht height=600
Aha. Denke bitte hierüber nach: Ich habe nicht gefragt, was in $replace[0] steht, sondern was in $replace steht.
Cheatah
komisch ist das gar nicht - ".*?" nimmt eben die wenigsten zutreffenden Zeichen, auch wenn es keine sind. Etwas wie "\d+" oder "[^ ]+" kann Dir jedoch ebenfalls helfen.
bei diesen replace-funktionen ist man ja nie ganz sicher, was sie machen :-) welches der beiden steht denn für zahlen? 1-3 stellige zahlen, um genau zu sein?
Aha. Denke bitte hierüber nach: Ich habe nicht gefragt, was in $replace[0] steht, sondern was in $replace steht.
was soll schon in $replace stehen wenn es ein array ist? nichts natürlich, wenn du echo $replace machst kommt Array...
Hallo,
welches der beiden steht denn für zahlen? 1-3 stellige zahlen, um genau zu sein?
\d{1,3}
http://de.php.net/manual/de/pcre.pattern.syntax.php, Abschnitt »Repetition«.
Aha. Denke bitte hierüber nach: Ich habe nicht gefragt, was in $replace[0] steht, sondern was in $replace steht.
was soll schon in $replace stehen wenn es ein array ist? nichts natürlich, wenn du echo $replace machst kommt Array...
Du hast das »Denke bitte hierüber nach« überlesen - zuerst einmal ist ein Konstrukt in dieser Form nicht möglich, siehe letzter Satz: »If pattern and replacement are arrays [dies ist bei dir nicht der Fall --molily], then preg_replace() takes a value from each array and uses them to do search and replace on subject. If replacement has fewer values than pattern [dies ist bei dir nicht der Fall --molily], then empty string is used for the rest of replacement values. If pattern is an array and replacement is a string [dies ist bei dir nicht der Fall --molily], then this replacement string is used for every value of pattern . The converse would not make sense, though. [dies ist bei dir der Fall --molily]« (http://de.php.net/manual/de/function.preg-replace.php)
Du willst vermutlich etwas völlig anderes erreichen, als Cheatah annahm (wozu, je nachdem, preg_replace nicht einmal die erste Wahl ist).
Willst du einen jeweils den x-ten Treffer des Regulären Ausdrucks durch den String im x-ten Arrayelement ersetzen? Ich zitiere dich:
also das erste height wird mit "height=300" und das zweite mit dem zweiten $replace-eintrag, also zum beispiel mit "height=290" ersetzt.
Falls du nicht weißt, welchen genauen Wert das x-te height-Attribut hat (es ist im Grunde genommen irrelevant, man könnte es auch in zwei Schritten mit preg_replace und einer wahrscheinlich auf Rekursion basierenden Funktion lösen, welche nach und nach mit strstr() die Vorkommnisse abarbeitet und einen neuen String erzeugt), aber weißt, welchen Wert das x-te height-Attribut haben muss, würde folgendes helfen:
$replace=Array(
'height=500',
'height=600',
...
);
$string='...';
function liefere_ersatzwert () {
global $replace;
list(, $replacement_string)=each($replace); /* Liefere aktuellen Wert und rücke im Array um ein Element nach vorne */
return $replacement_string;
}
$string2=preg_replace('/height=\d{1,3}/e', 'liefere_ersatzwert()', $string);
Zum pattern modifier »e« siehe: http://de.php.net/manual/de/pcre.pattern.modifiers.php und auch oben genannte Seite. (Sicherlich ließe sich das auch anders lösen.)
Mir fallen auch Lösungen zu anderen Fällen ein, vielleicht beschreibst du besser exakt, was du vorhast, denn dein Beispiel sowie deine Erklärungen sind nicht sehr ergiebig, sodass ich viel schreiben könnte, aber womöglich nichts auf deine Frage antworten würde.
Grüße,
Mathias
hi Mathias
also wenn ich wirklich so scheisse erklärt habe, was ich benötige, dann musst du hellseherische fähigkeiten haben! du hast den nagel voll auf den kopf getroffen. es funktioniert genau so, wie ich mir das vorgestellt hatte...
vielen dank!!
gruss simon