tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
609
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    blade runner blade runner ist offline Mitglied Bronze
    Registriert seit
    Feb 2007
    Beiträge
    48
    Hallo,

    ich möchte den Usern die Möglichkeit geben einen Regulären Ausdruck einzugeben.
    Natürlich traue ich den Usern nicht und möchte diesen Ausdruck auf Regex-Validität prüfen, bevor dieser ausgeführt wird.

    So, nun wird in diesen Video (-17:10) genau so ein Pattern vorgestellt.
    Hier noch mal ein Link zur Präsentation .

    Dieser Ausdruck funktioniert in meinen Editor (Kate), aber PHP gibt mir folgende Fehler:
    Code :
    1
    
    Warning: preg_match() [function.preg-match]: Unknown modifier ']' in ***

    Hier noch mal das Pattern:
    Code :
    1
    
    /\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/
    Wer weiß warum, oder kennt eine alternative Lösung?


    Ach ja, natürlich habe ich das mit und ohne zusätzliche Delimiter versucht.
    Geändert von blade runner (25.06.10 um 10:13 Uhr)
     

  2. #2
    deepthroat deepthroat ist gerade online Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.
    Zitat Zitat von blade runner Beitrag anzeigen
    ich möchte den Usern die Möglichkeit geben einen Regulären Ausdruck einzugeben.
    Natürlich traue ich den Usern nicht und möchte diesen Ausdruck auf Regex-Validität prüfen, bevor dieser ausgeführt wird.
    Mit einem reg. Ausdruck kann man ja keinen Schaden anrichten, d.h du könntest das Pattern einfach auf einen leeren String anwenden und z.B. prüfen ob preg_match FALSE zurückgegeben hat.
    Zitat Zitat von blade runner Beitrag anzeigen
    Hier noch mal das Pattern:
    Code :
    1
    
    /\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/
    Wie hast du denn den Ausdruck angewendet?

    Naja, reg. Ausdrücke sind nicht gleich reg. Ausdrücke. Dieser bietet lediglich rudimentäre Überprüfung und würde nicht alle in PHP gültigen reg. Ausdrücke akzeptieren, und es würde auch kaum ungültige reg. Ausdrücke erkennen (lediglich Ausdrücke die ungültige Zeichen enthalten).

    Gruß
    blade runner bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    blade runner blade runner ist offline Mitglied Bronze
    Registriert seit
    Feb 2007
    Beiträge
    48
    Hi Deepthroat,

    erstmal Danke für Deine Antwort.

    Zitat Zitat von deepthroat Beitrag anzeigen
    Hi.
    Mit einem reg. Ausdruck kann man ja keinen Schaden anrichten, d.h du könntest das Pattern einfach auf einen leeren String anwenden und z.B. prüfen ob preg_match FALSE zurückgegeben hat.
    Nein, FALSE reicht nicht. Bei FALSE ist das Pattern ja syntaktisch richtig. Es geht sich um einen fehlerhaftes Pattern.
    Meine bisherige Lösung ist aber schon so ähnlich.
    Ich finde sie aber völlig daneben, da ich erst einen Fehler auslösen muss, damit evtl. vorherige Regexfehler nicht mehr vorhanden sind.
    Weiterhin handelt es sich um ein Array von Pattern die geprüft werden. Von da her ist das Array von error_get_last bei Regexfehlern immer gleich.
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    @fopen();//erzeugt fehler->setzt den last error zurück
    @preg_match($aValue['pattern'],'');
    $aLastError=error_get_last();
    if(substr($aLastError['message'],0,12)=='preg_match()'){
      $aValue['patternFail']=$aValue['pattern'];
      unset($aValue['pattern']);
    }
    Wie hast du denn den Ausdruck angewendet?
    Ich liebe solche Fragen.
    - Ich stelle Sie selber sehr gerne.

    Meine Vorgehensweise bei so etwas ist:
    Code :
    1
    2
    3
    
    while(!$code){
      $code=anderer Code;
    }

    Also so ziemlich alles was mir eingefallen ist, aber bekomme weder die einzelnen Möglichkeiten zusammen noch die Reihenfolge.
    Naja, reg. Ausdrücke sind nicht gleich reg. Ausdrücke. Dieser bietet lediglich rudimentäre Überprüfung und würde nicht alle in PHP gültigen reg. Ausdrücke akzeptieren, und es würde auch kaum ungültige reg. Ausdrücke erkennen (lediglich Ausdrücke die ungültige Zeichen enthalten).
    Ja, ist klar.
    Aber es muss doch dafür eine Lösung geben. Bzw. einen Grund warum er in PHP nicht geht.

    Ein Regex-Pattern hat ja auch ein Muster, welches man erfassen kann (Meine Regex-Kenntnisse reichen einfach nicht aus um dieses zu definieren.).
    Und wenn ich den Usern so etwas erlaube, dann können diese auch ein wenig eingeschränkt werden. Wenn sich jemand deswegen beschwert, dann kann man immer noch was verschlimmbessern.

    ... oder gibt es eine Möglichkeit error_get_last zu initialisieren (Ohne den error Handler zu ändern)?

    Schöne Grüße
    Geändert von blade runner (25.06.10 um 11:24 Uhr)
     

  4. #4
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Also bei mir funktioniert das hier:
    PHP-Code:
    @preg_match("/O//","Haus",$match);
    $err error_get_last();
    if( 
    strpos($err["message"], "preg-match") )
      echo 
    "FEHLER";
    else
      
    var_dump($match); 
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  5. #5
    blade runner blade runner ist offline Mitglied Bronze
    Registriert seit
    Feb 2007
    Beiträge
    48
    Unter folgenden Bedingungen nicht mehr.
    Zitat Zitat von blade runner Beitrag anzeigen
    Weiterhin handelt es sich um ein Array von Pattern die geprüft werden. Von da her ist das Array von error_get_last bei Regexfehlern immer gleich.
    Ergo, sobald ein Pattern Fehlerhaft ist, haben die Folgenden den selben error_get_last.
     

  6. #6
    deepthroat deepthroat ist gerade online Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von blade runner Beitrag anzeigen
    Nein, FALSE reicht nicht. Bei FALSE ist das Pattern ja syntaktisch richtig.
    Nein, ist es nicht. Siehe z.B. http://www.php.net/manual/en/function.preg-match.php:
    preg_match() returns FALSE if an error occurred.
    PHP-Code:
    if (preg_match("#x**#""") === FALSE) {
      echo 
    "error in pattern";

    Zitat Zitat von blade runner Beitrag anzeigen
    Ich liebe solche Fragen.
    - Ich stelle Sie selber sehr gerne.
    Aber beantworten tust du sie nicht?! Ich wollte sehen wie dein Code aussieht.

    \edit: also bei mir funktioniert:
    PHP-Code:
    $r '#/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\/])*\]|[^\x00-\x1f\\/\[])+/[gim]*#'
    Gruß
    Geändert von deepthroat (25.06.10 um 11:55 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Naja, die Lösung hast du eigentlich schon gepostet
    Guck mal in deinem zweiten Post erste Zeile

    Das musst du nur am Anfang der Schleife jedesmal neu aufrufen


    Achtung Spoiler:

    $ArrayMitPattern
    foreach( $arrayMitPAttern as $pattern){
    //errorHandler zurücksetzten
    //preg_match ausführen
    //ggf Fehler abfangen
    }
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  8. #8
    blade runner blade runner ist offline Mitglied Bronze
    Registriert seit
    Feb 2007
    Beiträge
    48
    Aber....
    Deepthroat hat recht, es ist FALSE.

    preg_match gibt 1 oder 0 zurück und im Fehlerfall FALSE.

    Naja, Logischer fände ich true, false und im Fehlerfall null.

    THX@all.


    Edit: Hups geht das schnell hier. Alle Antworten fast Zeitgleich.
     

  9. #9
    blade runner blade runner ist offline Mitglied Bronze
    Registriert seit
    Feb 2007
    Beiträge
    48
    @deepthroat: THX, es lag an den Delimitern.

    Sorry, fürs nicht Antworten, der Code funktionierte ja nicht und war eliminiert. ... und es gab viiele Versionen.
     

Ähnliche Themen

  1. URL prüfen mit Regex
    Von HerbertJ im Forum PHP
    Antworten: 3
    Letzter Beitrag: 22.12.09, 11:42
  2. Antworten: 1
    Letzter Beitrag: 21.05.09, 21:02
  3. Substrings herausfiltern mittels Regex
    Von navyseal1 im Forum PHP
    Antworten: 8
    Letzter Beitrag: 24.07.08, 15:39
  4. Ankerpunkte mittels Regex auslesen
    Von U-Wasser-Gehaeuse im Forum PHP
    Antworten: 5
    Letzter Beitrag: 12.03.07, 20:09
  5. String mittels regex bearbeiten
    Von Samuel im Forum PHP
    Antworten: 5
    Letzter Beitrag: 02.10.03, 14:09