kostenloser Webspace werbefrei: lima-city


Problem mit regulärem Ausdruck

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sandrock-jonas

    Kostenloser Webspace von sandrock-jonas

    sandrock-jonas hat kostenlosen Webspace.

    Hallo,

    ich habe ein Problem mit einem regulären Ausdruck, der in meinem Forum bestimmte Zeichenketten durch Bilder (Smileys) ersetzen soll.

    Die Zeichenfolgen

    Semikolon_Minus_Klammer-zu und
    Semikolon_Klammer-zu

    sollen durch ein Bild ersetzt werden. Leider wird auch die Zeichenfolge:

    Anführungszeichen_Klammer-zu

    ersetzt, wobei die Anführungszeichen stehen bleiben und nur die Klammer ersetzt wird.

    Hier mal der Code:

    <?php
    $text = \'bla bla bla (\"bla\") bla\';
    echo preg_replace(\'/;-?\\)/i\',\'<img src=\"...\" alt=\"...\" />\',$text);
    ?>


    Ausgegeben wird:
    bla bla bla (\"bla\"<img src=\"...\" alt=\"...\" /> bla

    Wie diese komische Ausgabe zustande kommt, weiß ich nicht, denn alle anderen Zeichenfolgen, die nur eine Klammer-zu enthalten, werden nicht ersetzt.

    Wo liegt der Fehler? Ich bin ehrlich gesagt ziemlich ratlos.

    Beitrag geändert: 1.1.2008 12:26:52 von sandrock-jonas
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. benutzernaemelchen

    Kostenloser Webspace von benutzernaemelchen

    benutzernaemelchen hat kostenlosen Webspace.

    Huch. Wieso nimmst du nicht einfach str_replace()? ist doch sonst die übliche Methode?
  4. Hallo deine Regex stimmt einfach nicht.

    Die Klammern sind Grupierungssymbole in einer Regex d.h. du mußt Klammern als Zeichen escapen. Und das Fragezeichen gehört da auch nicht hin.

    ein Smiley ;-) hat also die Regex: \'/;-\\)/i\'

    So funktioniert es zum Bsp.:
    <?php
        $text = \'bla bla ;-) bla (\"bla\") bla\';
        echo preg_replace(\'/;-\\)/i\', \'<img src=\"...\" alt=\"...\" />\', $text);
    ?>



    Grüßle

    PS: ansonsten halt ne PM
  5. Autor dieses Themas

    sandrock-jonas

    Kostenloser Webspace von sandrock-jonas

    sandrock-jonas hat kostenlosen Webspace.

    benutzernaemelchen schrieb:
    Huch. Wieso nimmst du nicht einfach str_replace()? ist doch sonst die übliche Methode?

    Weil ich mir mit regulären Ausdrücken Schleifen sparen kann und verschiedene Zeichenfolgen auf einmal ersetzen kann (hier: Semikolon_Minus_Klammer-zu und Semikolon_Klammer-zu). Dazu müsste ich mehrfach str_replace aufrufen. Aber wenn ich keine Lösung mit regulären Ausdrücken hinbekomme, muss ich wohl auf str_replace zurückgreifen.

    scout schrieb:
    Die Klammern sind Grupierungssymbole in einer Regex d.h. du mußt Klammern als Zeichen escapen. Und das Fragezeichen gehört da auch nicht hin.

    1. Die Klammer hab ich escaped. Allerdings hat Lima den Backslash weggemacht, genau wie bei deinem Code. Ist mir nur beim Durchlesen meines Beitrags nicht aufgefallen.
    2. Ein Fragezeichen in einem Regex bedeutet, dass das Zeichen davor vorkommen darf, aber nicht muss. Es sollen schließlich sowohl die Zeichenfolge Semikolon_Minus_Klammer-zu als auch die Zeichenfolge Semikolon_Klammer-zu gefunden werden.
  6. s***h


    benutzernaemelchen schrieb:
    Huch. Wieso nimmst du nicht einfach str_replace()? ist doch sonst die übliche Methode?

    Weil ich mir mit regulären Ausdrücken Schleifen sparen kann und verschiedene Zeichenfolgen auf einmal ersetzen kann (hier: Semikolon_Minus_Klammer-zu und Semikolon_Klammer-zu). Dazu müsste ich mehrfach str_replace aufrufen. Aber wenn ich keine Lösung mit regulären Ausdrücken hinbekomme, muss ich wohl auf str_replace zurückgreifen.


    Du kannst die verschiedenen Kombinationen der Smileys doch einfach in ein Array schreiben...

    <?php
    function parsesmileys($text) {
    $suche = array( \':D\', \':biggrin:\', \'???\' );
    
    $ersetze = array( \' \', \' \', \' \' );
    
    $text = str_replace($suche, $ersetze, $text);
    return $text;
    }
    ?>



    Beitrag geändert: 1.1.2008 18:53:44 von sesch

  7. 1. Die Klammer hab ich escaped. Allerdings hat Lima den Backslash weggemacht, genau wie bei deinem Code. Ist mir nur beim Durchlesen meines Beitrags nicht aufgefallen.


    Ok, wenn du es escaped hast, funktioniert es bei mir wunderbar.


    2. Ein Fragezeichen in einem Regex bedeutet, dass das Zeichen davor vorkommen darf, aber nicht muss. Es sollen schließlich sowohl die Zeichenfolge Semikolon_Minus_Klammer-zu als auch die Zeichenfolge Semikolon_Klammer-zu gefunden werden.

    weiß ich - hab dich da nur falsch verstanden gehabt sorry.



    Also wie gesagt, dein geposteter Quelltext funktioniert soweit bei mir. Hast du evtl. ein UTF-8 Input und versuchst das Ersetzen ohne die Multibyte Funktionen? ...ansonsten mal hier schauen: http://de.php.net/manual/de/function.mb-ereg-replace.php

    Grüßle
  8. Autor dieses Themas

    sandrock-jonas

    Kostenloser Webspace von sandrock-jonas

    sandrock-jonas hat kostenlosen Webspace.

    scout schrieb:Also wie gesagt, dein geposteter Quelltext funktioniert soweit bei mir. Hast du evtl. ein UTF-8 Input und versuchst das Ersetzen ohne die Multibyte Funktionen? ...ansonsten mal hier schauen: http://de.php.net/manual/de/function.mb-ereg-replace.php

    Stimmt, der Quelltext funktioniert. Den habe ich als Beispiel hingeschrieben und nicht weiter ausprobiert.

    In meinem Forum funktioniert das so:
    Ein User gibt einen Text ein. Dieser wird so, wie er ist, in einer MySQL-Tabelle gespeichert. Wenn dann jemand den Thread ansehen will, wird der Text aus der Tabelle ausgelesen, in HTML-Code verwandelt und unter anderem die Smilieys ersetzt. Ist das dann UTF-8? Mit diesen Kodierungen kenne ich mich leider nicht aus. Auch der Einsatz von mb_ereg_replace() hat nicht geholfen.

    edit
    Der Fehler lag wo ganz anders. Der reguläre Ausdruck ist richtig, aber vorher wurden durch die Funktion htmlentities() angewandt und somit die Anführungszeichen durch & quot; ersetzt, was am Ende ein Semikolon enthält. Bei dieser Funktion habe ich nun die Option ENT_NOQUOTES gesetzt. So funktionierts.

    Beitrag geändert: 2.1.2008 15:22:00 von sandrock-jonas
  9. Anstatt ENT_NOQOUTES zu nutzen würde ich ganz einfach ein Leerzeichen vor und hinter einem Smilie verlangen.
    Ist auf der anderen Seite auch für den Leser angenehmer.
  10. 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!