Hallo, Am Thu, 08 Sep 2005, Manfred Rebentisch schrieb:
Am Donnerstag, 8. September 2005 00:22 schrieb David Haller:
Am Wed, 07 Sep 2005, Manfred Rebentisch schrieb:
Ah, also für PHP habe ich es gefunden:
file:/usr/share/doc/packages/phpdoc/manual/pcre.pattern.syntax.html
Das "pcre" steht fuer "Perl Compatible Regular Expression(s)". Siehe dazu also auch 'perldoc perlre' 'perldoc perlrequick', 'perldoc perlreref' und 'perldoc perlretut'.
Gut, das sind wirklich hilfreiche und umfangreiche Dokumente.
*hehe*
Und falls du mal wie der Ochs vor'm Berg stehst, dann frag doch einfach, hier oder in einer passenden newsgroup wie z.B. de.comp.lang.perl.misc wenn du z.B. eine RE fuer ein bestimmtest Problem suchst oder eine RE nicht nachvollziehen kannst. Das ist ein tolles Angebot. Gut, ich habe es inzwischen herausbekommen. Ich wollte die PCRE-Syntax:
"#\[email\]([a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+)\[/email\]#si"
die in PHP z.B. mit preg_replace benutzt wird, verwenden für GNU regcomp und regexec. Das sind keine PCRE-Funktionen, sondern die normalen POSIX Methoden.
Vergleiche die Definition von z.B. '\w' in einer PCRE mit '[:alpha:]' in einer POSIX-RE ;)
Erkannt wird damit ein String wie "[email]user@domain.tld[/email]".
Ich habe es mit "\[email\]([[:alnum:]@\-_\.]*)\[/email\]" versucht und es ^^^^^^^ funktioniert auch - aber es ist nicht das gleiche. Ich dachte, es sei richtig, die Syntax so umzustellen (nachdem ich die Doku gelesen hatte und wußte, daß "\w" Wortzeichen sind):
"\[email\]([a-z0-9&\-_.]+?@[[:alnum:]\-]+\.([[:alnum:]\-\.]+\.)? ^^ Achtung! Das ist in beiden Faellen (auch in perl) faslch. So geschrieben ist das "alnum" + '\' + '-' + '\' + '.'. Korrekt waere:
PCRE: [\w.-] POSIX: [[:alpha:].-] Man beachte, dass der '-' nur als erstes oder letztes Zeichen seine Sonderbedeutung verliert -- der '\' jedoch, genau wie der '.' per se in einer Zeichenklasse (-> "[]") keine Sonderbedeutung hat. Sowas kann zu evtl. unerwuenschten Nebeneffekten fuehren...
[[:alpha:]]+)\[/email\]"
und siehe da, jetzt funktioniert es.
Dein: \[email\]([a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+)\[/email\] ist in POSIX-ERE (siehe man 7 regex) also (ungetestet): \[email\]([a-z0-9&_.-]+?@[[:alpha:]-]+\.([[:alpha:].-]+\.)?[[:alpha:]]+)\[/email\] Wobei mir gerade auffaellt, dass die RE eigentlich nicht korrekt fuer Email-Adressen ist (aber "gut genug" fuer viele Faelle ;).
Auch mit der Syntax
"#\[url\]([\w]+?://[^ \"\n\r\t<]*?)\[/url\]#is" umgestellt zu "\[url\]([[:alpha:]]+?://[^\"[:space:]<]*?)\[/url\]" hatte ich Probleme, bis ich darauf kam, "[[:alpha:]]" statt "[:alpha:]" einzusetzen (um z.B. "[url]http://www.domain.tld[/url]" zu erkennen).
Du kannst die POSIX-Klassen ([:alpha:] etc. nur genauso(!) wie einen einzelnen Buchstaben innerhalb einer []-Gruppe verwenden. Das steht so auch in 'man 7 regex' (und anderswo), aber eben eher implizit... ==== man 7 regex ==== [..] A bracket expression is a list of characters enclosed in `[]'. [..] Within a bracket expression, the name of a character class enclosed in `[:' and `:]' stands for the list of all char acters belonging to that class. ==== Entscheidend sind die Woerter "Within" und "enclosed". *INNERHALB* eines []-Ausdrucks koennen benannte Zeichenklassen stehen, wobei der *Name* der Zeichenklasse wiederum von "[:" und ":]" *umschlossen* sein muss! Bsp: die Klasse "xdigit" hat _umschlossen_ von "[:" und ":]" ==> "[:xdigit:]" *innerhalb* einer "Bracket-Expression" "[]" zu stehen, also ==> "[[:xdigit:]]"... Liest man die manpage also sorgfaeltig genug kommt man dahinter ;) Ob es eine Uebersetzung von regex(7) gibt und wie gut diese ist weiss ich nicht. Da ich gut genug englisch kann lese ich nur englische manpages. Die Uebersetzungen sind oft - veraltet - schlecht/irrefuehrend uebersetzt - lueckenhaft oder alles zusammen. Wer englisch auch nur halbwegs lesen kann sollte die englischen manpages zumindest _AUCH_ mal lesen/anschauen... Man vergleich z.B. 'man -L de ls' mit 'man -L en ls'... -dnh -- Nature, and Nature's laws lay hid in night God said, Let Newton be! and all was light. -- Alexander Pope It did not last: the Devil howling "Ho! Let Einstein be!", restored the status quo. -- J. C. Squire