Mittels Regex Gültigkeit einer anderen Regex prüfen

blade runner

Mitglied
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:
Warning: preg_match() [function.preg-match]: Unknown modifier ']' in ***

Hier noch mal das Pattern:
Code:
/\/(\\[^\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.
 
Zuletzt bearbeitet:
Hi.
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.
Hier noch mal das Pattern:
Code:
/\/(\\[^\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ß
 
Hi Deepthroat,

erstmal Danke für Deine Antwort.

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:
@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:
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
 
Zuletzt bearbeitet:
Also bei mir funktioniert das hier:
PHP:
@preg_match("/O//","Haus",$match);
$err = error_get_last();
if( strpos($err["message"], "preg-match") )
  echo "FEHLER";
else
  var_dump($match);
 
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:
if (preg_match("#x**#", "") === FALSE) {
  echo "error in pattern";
}
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:
$r = '#/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\/])*\]|[^\x00-\x1f\\/\[])+/[gim]*#';
Gruß
 
Zuletzt bearbeitet:
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 ;)


$ArrayMitPattern
foreach( $arrayMitPAttern as $pattern){
//errorHandler zurücksetzten
//preg_match ausführen
//ggf Fehler abfangen
}
 
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.
 
@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.
 
Zurück