preg_replace Zeilenumbruch ignorieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
all
code
erstellt code
erwartet verzweifeln
genannten mengen
jemand
leute
manipulieren
match
menge
not
nutzen
paar
problem
punkt
resultat
set
string
url
zeichen
-
Hallo zusammen,
ich stehe vor dem Problem, dass ich einen Code mittels preg_replace manipulieren will.
Soweit funktioniert fast alles. Wenn jedoch ein Zeilenumbruch zwischen einem Suchstring ist, wird nichts ersetzt. Ich habe schon nach Antworten gesucht, wurde jedoch nicht fündig.
Bis jetzt habe ich lediglich indem ich alle Zeilenumbrüche aus dem String entfernt habe Erfolg gehabt. Ich muss die Form des Strings jedoch behalten, wodurch diese Lösungsmöglichkeit rausfällt.
Um mein Problem zu verdeutlichen habe ich folgenden Beispielcode erstellt:
<?php $replace_one = '<img src="test.png" width="612" height="84" alt=""title="">'; $replace_two = '<img src="test.png" width="612" height="84" alt=""title="">'; $result_one = preg_replace('/<img(.*?)src="(.*?)"(.*?)>/', '<img$1src="leer"$3>', $replace_one); $result_two = preg_replace('/<img(.*?)src="(.*?)"(.*?)>/', '<img$1src="leer"$3>', $replace_two); print_r( $result_one."\n"); print_r( $result_two ); ?>
Resultat:
<img src="leer" width="612" height="84" alt=""title=""> <img src="test.png" width="612" height="84" alt=""title="">
Ich weiß leider nicht mehr weiter - sonst hätte ich hier nicht gepostet. Ich hoffe jemand kann mir dabei helfen.
Vielen Dank im Voraus!
Gruß Thorsten -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Das Problem ist einfacher als man denkt, aber lässt mehr Leute als erwartet verzweifeln. Das Problem ist, dass es ein Detail ist, das so einfach zu übersehen wird.
Das Problem ist der Punkt: Der Punkt ist in RegExp das Zeichen für einen beliebigen Character - Der LineBreak ist jedoch nicht als Character definiert, und damit Matched der Punkt keinen Linebreak.
Es gibt jedoch auch einen Selektor für "all Whitespace like", das \s. Ein Whitespace like sind Tabulatoren, Whitespaces, aber auch Linebreaks. Dazu gibt es das nette Komplimentär, das \S, welches "all not Whitespace like" bezeichnet. (Falls du es noch nicht kennst, die \d, \s usw sind Shorthands für Zeichenketten. Wenn du den Buchstaben jedoch groß machst, ist es eine Negierung dieses Zeichenraums).
Da du mit deinem Punkt also wirklich alle Zeichen meinst, auch LineBreaks, musst du die oben genannten Mengen nutzen. Das sieht dann so aus:
'/<img([\s\S]*?)src="([\s\S]*?)"([\s\S]*?)>/'
Du ersetzt quasi alle Punkte mit [\s\S], da diese Menge wirklich alle möglichen Zeichen umfässt.
Liebe Grüße -
Besten Dank!!!
Schade, dass ich es nicht in den unzähligen durchforsteten Dokumentationen zu regulären Ausdrücken gefunden habe.
Das hat mich jetzt ein paar Stunden gekostet.
Gruß Thorsten -
leicht-gekocht schrieb:
So hat es bei mir in beiden Fällen geklappt...
<?php $replace_one = '<img src="test.png" width="612" height="84" alt=""title="">'; $replace_two = '<img src="test.png" width="612" height="84" alt=""title="">'; $result_one = preg_replace('/<img(.*?)src="(.*?)"(.*?)>/', '<img$1src="leer"$3>', $replace_one); $result_two = preg_replace('/<img(.*?)src="(.*?)"(.*?)>/', '<img$1src="leer"$3>', $replace_two); print_r( $result_one."\n"); print_r( $result_two ); ?>
$result_one = preg_replace('/<img(.*?)src="(.*?)"(.*?)>/s', '<img$1src="leer"$3>', $replace_one); $result_two = preg_replace('/<img(.*?)src="(.*?)"(.*?)>/s', '<img$1src="leer"$3>', $replace_two);
Edit: ggamee war ein bisschen schneller...
Beitrag zuletzt geändert: 1.11.2016 22:40:50 von staymyfriend -
ggamee schrieb:
Das ist zwar eine Lösung des Problems, aber weder die einfachste, noch die schönste. Die wohl bessere Lösung ist es, den Modifier
Da du mit deinem Punkt also wirklich alle Zeichen meinst, auch LineBreaks, musst du die oben genannten Mengen nutzen. Das sieht dann so aus:
Du ersetzt quasi alle Punkte mit [\s\S], da diese Menge wirklich alle möglichen Zeichen umfässt.'/<img([\s\S]*?)src="([\s\S]*?)"([\s\S]*?)>/'
zu nutzen, siehe auch staymyfriends Variante:s
s (PCRE_DOTALL)
If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded. -
hackyourlife schrieb:
Das ist zwar eine Lösung des Problems, aber weder die einfachste, noch die schönste. Die wohl bessere Lösung ist es, den Modifier
zu nutzen, siehe auch staymyfriends Variante:s
s (PCRE_DOTALL)
If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded.
Stimmt, in PHP funktioniert der Modifier, hatte ich vergessen. Nicht alle Sprachen unterstützten ihn, daher vergess ich des gerne.
Ist sogar bissel übersichtlicher :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage