Anzeige:
Ergebnis 1 bis 8 von 8

Thema: regular expressions

  1. #1
    Registrierter Benutzer
    Registriert seit
    06.11.2003
    Ort
    sessel vor dem pc
    Beiträge
    66

    regular expressions

    ich ma wieder...

    helft mir ma bitte schnell auf die spruenge:

    PHP-Code:
    preg_match("!\|[a-z0-9]+\|!im",$str); 
    ich suche also ne beliebige zeichenkette mit buchstaben und/oder zaehlen eingeschlossen in hochstriche... jetz soll der aber

    Code:
    |toplevel|
    nich finden... haut irgendwie nich so hin wie ich mir das vorstelle....

  2. #2
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Soll das gesuchte in $str auftauschen oder prüfst Du nur auf wahr oder falsch. Denn wenn es in $str auftauchen soll, hast Du vergessen mit anzugeben was auftauchen soll:
    PHP-Code:
     preg_match("!\|([a-z0-9]+)\|!i",$str); 
    Außerdem wozu Du den Modifier m brauchst, verstehe ich auch nicht.

    Pingu
    Homepage: www.pingu.info

  3. #3
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Wenn er größere Textpassagen durchsucht ist multiline schon richtig.
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  4. #4
    Registrierter Benutzer
    Registriert seit
    06.11.2003
    Ort
    sessel vor dem pc
    Beiträge
    66
    danke @undefined...... pingu du musst dir angewoehnen zu beruecksichtigen, dass scripte auch ueber den umfang des hier vorgestellten hinausgehen koennen... aber zu deiner frage:

    es handelt sich tatsaechlich nur um große zeichenketten, in denen mehrmals dieses muster auftaucht, sollte aber lediglich |toplevel| (also eine bestimmte zeichenkette) auftauchen, so soll er darauf nicht anspringen.... einzelne zeichen zu negieren bekommt man ja hin, aber wenn ich das mit zeichenketten auf die selbe weise probiere hat es nicht funktioniert.. ich formuliers ma so:

    PHP-Code:
    <?php
    $str 
    preg_replace("!\|[a-z0-9]+\|!im","",$str);
    ?>
    |toplevel| soll jetzt NICHT ersetzt werden.... und dass es nich im suchmuster steht, liegt daran, dass ich hier erfragen will wie ich es einbauen muss dass es nicht ersetzt wird

  5. #5
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Zitat Zitat von ohcibi
    danke @undefined...... pingu du musst dir angewoehnen zu beruecksichtigen, dass scripte auch ueber den umfang des hier vorgestellten hinausgehen koennen...
    Das ist mir schon klar. Deswegen auch meine Gegenfrage. Weil aus den gegebenen Informationen konnte ich nicht auf alles schließen.

    Leider ist mir jetzt auch erst bei nochmaligen lesens aufgefallen, daß da wiedermal das kleine Wörtchen "nicht" verborgen war. Welches ich leider gerne immer wieder übersehe ;-)

    Ich weiß ja nicht wofür Du es brauchst. Aber ich hatte mal ein ähnliches Problem als ich mir meine Sessions noch selber gebaut habe. Ich mußte alle Links, die nicht auf externe Adressen verweisen, entsprechend um eine Kennung erweitern. Also entsprechend alle Links ersetzen, die ein bestimmtes Keyword nicht enthalten. Nach etwas Suche bin ich auf folgendes gestossen:
    PHP-Code:
                    $search    = array();
                
    $search[0] = "/(href|src)=(\"|')(?!javascript:|http:|ftp:|mailto:)([^#]*?)\\?([^#]*?)(\"|')/i";
                
    $search[1] = "/(href|src)=(\"|')(?!javascript:|http:|ftp:|mailto:)([^?#]*?)(\"|')/i";
                
    $search[2] = "/(href|src)=(\"|')(?!javascript:|http:|ftp:|mailto:)([^#]*?)\\?([^#]*?)#(.*?)(\"|')/i";
                
    $search[3] = "/(href|src)=(\"|')(?!javascript:|http:|ftp:|mailto:)([^?#]*?)#(.*?)(\"|')/i";
                
    $search[4] = "/<form(.*?)>/i"
    Das "nicht" wird durch die Kombination "?!" erreicht. In Deinem Fall würde ich folgendes versuchen (natürlich müssen jetzt die Ausrufezeichen ersetzt werden, wenn es innerhalb der Suche nicht escaped werden soll - außerdem wegen den doppelten Anführungszeichen muß AFAIK alles doppelt escaped werden, damit bei der Regex auch alles richtig ankommt):
    PHP-Code:
    $str preg_replace("/\\|(?!toplevel)\\|/im","",$str);

    oder

    $str 
    preg_replace('/\|(?!toplevel)\|/im',"",$str); 
    Pingu

    EDIT: siehe auch Kapitel Assertions: http://de2.php.net/manual/en/referen...nce.assertions
    Geändert von Pingu (14-03-2005 um 19:22 Uhr)
    Homepage: www.pingu.info

  6. #6
    Registrierter Benutzer
    Registriert seit
    06.11.2003
    Ort
    sessel vor dem pc
    Beiträge
    66
    Zitat Zitat von pingu
    PHP-Code:
    $str preg_replace("/\\|(?!toplevel)\\|/im","",$str);

    oder

    $str 
    preg_replace('/\|(?!toplevel)\|/im',"",$str); 
    okay soweit so gut... und wenn ich jetz das [a-z0-9] noch mit reinbaue haut das hin meenste? weil es duerfen natuerlich nur buchstaben und zahlen zwischen den hochstrichen vorkommen......

    ich weiß gar nich mehr wieso ich das brauche, ich hab das dann irgendwie anderes geloest, und den thread hier vergessen, die benachrichtigung is irgendwie ausgewesen 8-)

  7. #7
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Zitat Zitat von ohcibi
    okay soweit so gut... und wenn ich jetz das [a-z0-9] noch mit reinbaue haut das hin meenste? weil es duerfen natuerlich nur buchstaben und zahlen zwischen den hochstrichen vorkommen......
    Also ich bin kein Held, soll heißen ich kein Regex-Experte. Soll heißen: ich weiß es nicht. Deshalb würde ich an der Stelle einfach einen zweistufigen Prozess machen, d. h. zuerst alles illegale rausschmeisen und dann nach dem eigentlichen suchen, z.B.:
    PHP-Code:
     $str preg_replace("/\\|(?!toplevel)\\|/im","-test-",preg_replace("/(\\|[^a-z0-9]+\\|)/im"""$str)); 
    Wobei dies das Problem hat, daß so etwas nicht auf folgendes funktioniert:
    Code:
    dhj45|kjhfjkh4345kj|jflewrh rhthlh54%§§$$|keljhrt4374|kf4
    Denn die erste Ersetzung würde daraus folgendes produzieren:
    Code:
    dhj45|kjhfjkh4345kjkeljhrt4374|kf4
    Die zweite Ersetzung würde folgendes machen:
    Code:
    dhj45|-test-|kf4
    Alternativ könnte man die Ersetzung auch folgendermaßen machen (siehe geänderte Klammerung):
    PHP-Code:
     $str preg_replace("/\\|(?!toplevel)\\|/im","-test-",preg_replace("/\\(|[^a-z0-9]+)\\|/im"""$str)); 
    Das würde aus obiger Eingabe folgendes in der ersten Ersetzung produzieren:
    Code:
    dhj45|kjhfjkh4345kj||keljhrt4374|kf4
    Der zweite Schritt führt dann zu:
    Code:
    dhj45|-test-||-test-|kf4
    Pingu
    Homepage: www.pingu.info

  8. #8
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    @ohcibi
    Du hast ein Verständnis Problem
    Du mußt erst das Suchen was paßt und dann kannst du hingehen und mit einem Lookbehind auf die Treffer eine Auskrenzung machen.
    Code:
     echo preg_replace( "/\|[\w\d]+(?<!toplevel)\|/i", "###", $string );
    mfg undefined
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •