[PHP] Frage / Reg. Ausdrücke / POSIX



  • $string = 'Es ist sehr wichtig!';

    ereg_replace ( '*([^]])**' , '<b>\1</b>' , $string );

    $string sollte nun 'Es ist <b>sehr</b> wichtig!' enthalten.

    Nur würde das Muster dann nicht so aussehen?:

    '*(.)**'

    Das '^' ist im Beispiel oben ja ein Nicht-Zeichen (also alle Zeichen außer ']'). Aber wieso gerade außer ']'? Wo ist das Problem an meinem Muster?

    MfG SideWinder



  • Dein Ausdruck ist zu gierig! (.*) schluckt normalerweise soviel wie irgend möglich, Dein zweiter Tag würde also mit erfasst werden. Durch den Ausschluss der ekigen Klammern wird eben das verhindert.

    So gehts:

    [b](.*?)[/b]
    

    Gruß Jens
    P.S.:
    8.2. Soll ich ereg() oder preg() verwenden? http://www.dclp-faq.de/q/q-regexp-ereg.html

    [ Dieser Beitrag wurde am 01.07.2003 um 19:32 Uhr von Sa(n)dman editiert. ]


  • Mod

    preg ist besser als ereg()

    also in diesem Fall sollte man preg_replace nehmen.

    preg ist nämlich schneller als ereg - wobei glaube ich das hauptaugenmerk auch auf preg liegt, so dass preg sicher weiterentwickelt wird.

    wobei ich mir beim letzten punkt nicht sicher bin.



  • ...wobei glaube ich das hauptaugenmerk auch auf preg liegt, so dass preg sicher weiterentwickelt wird.
    wobei ich mir beim letzten punkt nicht sicher bin.

    Das ist so nicht ganz richtig! Die ereg*-Funktionen sind gegen die regex.h Deines Unix gelinkt (POSIX-Standard), wärend die PCRE auf der pcrelib von Philip Hazel aufsetzen. Auf die Weiterentwicklung beider Systeme hat die PHP-Entwicklergemeinschaft also keinen direkten Einfluss (abgesehen von den üblichen Möglichkeiten der GPL).

    Gruß Jens



  • Wieso verunstaltet er mir meinen Beitrag so?? Hab gar nix fett angegeben 😕

    So preg_replace benötigt noch zwei '/' außen ansonsten ist der Ausdruck nun gleich wie vorher.

    Also:

    preg_replace ( '/ \ [ b ] ( [ ^ ] ] * ) \ [ / b ] /' , bla , bla );

    Hieß es im Buch.

    Und ich versteh nicht für was [^]] steht? Warum zwei schließende Klammern?

    MfG SideWinder

    Edit: Achso [ b ] kann ich nicht nehmen weil er sonst Fettdruck macht...

    [ Dieser Beitrag wurde am 01.07.2003 um 20:53 Uhr von SideWinder editiert. ]



  • BTW: Ich lerne gerade Reg. Ausdrücke und vor Perl werden die POSIX-Ausdrücke erklärt wie in der Überschrift zu finden. POSIX heißt nun aber mal ereg_replace!

    MfG SideWinder



  • [code]
    preg_replace('/*([^]])**/' , bla , bla );[/code]

    Wenn das wirklich im Buch stand, dann solltest Du dieses Buch entsorgen.
    1. Das ist kein POSIX-konformer RegEx.
    2. Der RegEx ist fehlerhaft. Wenn Du einen Delimiter ("/") im regulären Ausdruck verwendest, dann muss er ausmaskiert werden. Des weiteren müssen natürlich auch alle Zeichen ausmaskiert werden, die eine Bedeutung in der Sprache der regulären Ausdrücke haben und nicht als solche verwendet werden.

    Und ich versteh nicht für was [^]] steht? Warum zwei schließende Klammern?

    Mit eckigen Klammern definierst Du eine Buchstabenklasse, also eine Menge von Buchstaben. In diesem Fall wird die Menge aller Buchstaben außer der schließenden eckigen Klammer definiert. Allerdings ist das auch nicht ganz logisch, da Du damit auch noch das [/b ersetzen würdest.

    Gruß Jens



  • Nein stand nicht im Buch -> wie gesagt wurde das hier verändert weil [ b ] (ohne Leerzeichen) Fettschrift einleitet...wie oft muss man dass denn noch sagen :o;).

    Fangen wir nochmal von vorne an. Ihr verwirrt mich :p.

    ---THREADBEGINN #2---

    Ich habe gerade die POSIX-Ausdrücke hinter mir und habe folgenden Ausdruck gefunden:

    $string = 'It is [ b ] not [ /b ] a matter of diplomacy.';
    echo ereg_replace ( '\ [ b ] ( [ ^ ] ] * ) \ [ / b ]', '<b>\1</b>' , $string );
    
    Angebliche Ausgabe:
    It is <b>not</b> a matter of diplomacy.
    

    Der String und das Muster enthalten natürlich nicht soviele Leerzeichen -> aber ansonsten verändert mir das Forum das wieder.

    So und jetzt habe ich gerade begriffen wieso das funktioniert :D. Das gierige '*' geht bis zum abschließenden ']' von [ / b ]. Dann geht er solange zurück bis [ / b ] reinpasst und ist fertig -> Ausgabe stimmt also.

    War nur noch nicht damit vertraut, dass die Operatoren gierig sind 😃

    So danke 🙂

    MfG SideWinder


Anmelden zum Antworten