kostenloser Webspace werbefrei: lima-city


preg_replace Zeilenumbruch ignorieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    leicht-gekocht

    leicht-gekocht hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. g****e

    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
  4. Autor dieses Themas

    leicht-gekocht

    leicht-gekocht hat kostenlosen Webspace.

    Besten Dank!!!

    Schade, dass ich es nicht in den unzähligen durchforsteten Dokumentationen zu regulären Ausdrücken gefunden habe. :wall:
    Das hat mich jetzt ein paar Stunden gekostet.


    Gruß Thorsten
  5. leicht-gekocht schrieb:

    <?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 );
    
    ?>
    So hat es bei mir in beiden Fällen geklappt...
    $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
  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    ggamee schrieb:
    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.
    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
    s
    zu nutzen, siehe auch staymyfriends Variante:
    s (PCRE_DOTALL)
    If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded.
  7. g****e

    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
    s
    zu nutzen, siehe auch staymyfriends Variante:
    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 :)
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!