Probleme mit der preg_replace

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit der preg_replace

    Hi

    ich benötige mal eure Hilfe. Ich bastel an einem bbcode parser. Der Parser soll erkennen, daß ein :wave: zb ein Smilie ist. Das klappt mich diesem code hier auch ganz gut:
    PHP-Code:
    $Help "<img class=\"smilie\" src=\"http://www.mydomain.de/smilies/$1.gif\">";
    $input preg_replace('!:([A-Za-z0-9_]+?):!'$Help$input); 
    Damit werden alle Smilies angezeigt, aber wenn ich Uhrzeiten im Text habe:
    "blabal 2011-01-27 10:30:23", dann versucht er die :30: auch als Smilie zu ersetzen. Wie kann ich das verhindern? Eigentlich müste ich ja nur sicherstellen, daß nach dem 2. : ein leerzeichen kommt bzw kein weiterer Buchstabe oder zahl, nur dann sollte es ein Smilie sein, oder? Bei einem Smilie dürfte danach ja nur leerzeichen. Tabs, Satzeichen oder Zeilenende kommen

    Wie müßte dann meine RegExpression aussehen?

    Danke im vorraus
    Zuletzt geändert von grka; 27.01.2011, 13:48.

  • #2
    Verwende strtr() statt preg_replace().

    Kommentar


    • #3
      was macht strstr()? Hat das die gleiche Expression?

      Kommentar


      • #4
        Hab mal nachgesehen, daß kann ich ja nur alles vor oder nach einem Zeichen ausgeben, in wiefern kann mir das bei meinem Problem helfen?!

        Kommentar


        • #5
          PHP-Code:
          $smilies = array(
              
          ':wave:' => '<img src="http://example.org/wave.gif" alt=":wave:" />',
              
          ':-)'    => '<img src="http://example.org/laugh.gif" alt=":-)" />',
              
          ':-('    => '<img src="http://example.org/sad.gif" alt=":-(" />'
          );

          $text strtr($text$smilies); 

          Kommentar


          • #6
            Das würde aber bedeuten, daß ich jedes einzelne Smilie auflisten müsste. Genau das möchte ich ja umgehen und etwas universelles bauen. der bbcode pro Smilie entspricht dem Dateinamen ohne .gif. dh ein smilie :wave: heißt wave.gif in dem Verzeichnis. Also möchte ich eine Expression mit der ich das : for und nach dem wave wegbekomme und er einen html Befehl drumherumbaut und das.gif dran hängt. Mit dem obigen code funktioniert das auch schon hervorragend, nur bei Uhrzeitangaben halt nicht. Ich möchte das die obige Expression nur dann funktioniert wenn nach dem 2. : kein buchstabe oder Zahl steht

            Kommentar


            • #7
              Zitat von grka Beitrag anzeigen
              Das würde aber bedeuten, daß ich jedes einzelne Smilie auflisten müsste.
              Nein, musst du nicht. Das ist das tolle an Programmiersprachen: Man kann dem Computer sagen, dass er die Arbeit für einen machen soll.

              Du kannst dir ja ein Array an Smilies automatisiert aufbauen.

              Außerdem kann so nicht passieren, dass auf Bilder verlinkt wird, die gar nicht existieren. Könnte ja jeder irgendwas schreiben, dass dann durch ein nicht existierendes Bild ersetzt wird. zB. :dashierhabichmireinfachsoausgedacht:

              Kommentar


              • #8
                Normalerweise schreiben unsere user ja nicht den bbcode selber sondern clicken die smilies an. Ich dachte mir halt, das es einfacher ist diese obige Expression zu erweitern, nachdem motto nach dem 2. : soll kein Buchstabe oder Zahl kommen. Das sollte doch eine kleinigkeit sein, ich bin nur nicht so fit in den Expressions.
                hatte das hier probiert:
                PHP-Code:
                $input preg_replace('!:([A-Za-z0-9_]+?):([^A-Za-z0-9])!'$Help$input); 
                Da wird zwar die Uhrzeit richtig angezeigt, aber die Smilies nicht mehr umgewandelt

                Kommentar


                • #9
                  Warum ersetzt du die Doppelpunkte nicht durch eckige Klammern?

                  [wave]

                  Dann dürfte das Uhrzeitproblem gelöst sein.

                  Gruß
                  Frank

                  Kommentar


                  • #10
                    Dann hab ich aber das Problem wenn einer was in eckigen Klammern schreibt. gibts denn keinen regulären ausdruck mit dem man sagen kann, daß nach dem 2. Doppelpunkt kein buchstabe oder zahl kommen darf?!

                    Kommentar


                    • #11
                      Hab eine Lösung bekommen:
                      PHP-Code:
                      $input preg_replace('!:([A-Za-z0-9_]+?)(:$)!'$Help$input); 

                      Kommentar

                      Lädt...
                      X