hm, eine extra prüfung wäre vllt. auch ein weg, aber dieser kostet imho unnötige rechenzeit, welche du einsparen kannst und den code nicht unnötig aufblähen musst, da du dies ohne probleme inline erledigen kannst.
reguläre ausdrücke wären ebenso fehl am platz, da dies genauso unnötig rechenzeit verbrät, denn einzelne string-funktionen arbeiten schneller und du kannst ebenso genauer matchen. es ist zwar ein komfortabler weg, aber regexps verwendet man (bzw. ich) nur bei größeren texten. z.b. bei html seiten mit bb-code oder ein gesamtes parsing einer seite sind ein guter fall für regexps, da man dies nur sehr umständlich mit kurzen string-funktionen lösen kann (bzw. den code nur unnötig aufblähen). aber wenn du unbedingt auf regexps ausweichen willst, kannst du das natürlich gerne tun. ein gutes tutorial gibt es z.b. bei
regular-expressions.info. unlogisch aufgebaut ist es definitiv nicht, denn ein bestimmtes muster steckt immer dahinter.
vllt mal ein paar kleine beispiele anhand von bb-code:
dieser regexp matcht alles, was zwischen den tags [ b] und [ /b] steht (leerzeichen wegdenken) und ersetzt sie mit dem jeweiligen äquivalent, welches du im nachhinein angibst (natürlich nur wenn du wünscht). beispiele kennst du dafür ja bestimmt zu genüge. halt jeder text, der fett geschrieben wird, kann so gematcht werden.
Code:
#\[url=www.(.*?)\]\[img\]www.(.*?)\[/img\]\[/url\]#
dieser regexp matcht z.b. alle verlinkten bilder im format [ url=http://www.example.tld/][ img]http://www.example.tld/foo/bar/foo.png[ /img][ /url].
Code:
#\[img=(.*?)\|(.*?)\](.*?)\[/img\]#si
matcht alles was im format [ img=breite|höhe]
http://www.example.tld/foo/bar/foo.png[ /img] auftritt.
vllt mal eine kurze erklärung:
regexps müssen in zeichen begrenzt sein (in den oberen beispielen, betrifft dies das
#). bei manchen implementierungen brauchst du diese nicht, aber in javascript (=
/.../), php (= frei wählbar) und noch anderen werden diese gebraucht. das
si bei den oberen beiden hinter dem begrenzer bedeutet, dass der ausdruck nur auf einer zeile auftreten darf (betrifft das
s) und kontext-insensitiv (betrifft das
i) sein muss (d.h. es ist wichtig, ob groß- oder kleinschreibung von interesse ist). die escape sequenzen kennst du ja auch aus c (z.b. für einen tab-stopp
\t, neue zeile
\n oder einen carriage return (wagenrücklauf)
\r), denn die zeichen
[ und
] haben eine andere bedeutung. alle sachen, welche in klammern stehen, bedeuten, dass diese als "rückgabewert" gehandhabt werden. mit diesen kannst du also arbeiten, d.h. diese ersetzen, korrigieren, irgendwo anders einfügen oder oder oder. der punkt bedeutet, dass irgend ein zeichen auftreten darf, egal ob
ä,
#,
$,
ü,
a,
0,
f, ... . das sternchen heißt, dass dieses zeichen bzw. der ausdruck, welche davor steht, x mal auftreten kann (egal ob 0 mal, 20 mal, 100 mal oder 1.000.000 mal). der "gegensatz" dazu ist das
+, was heißt, dass der ausdruck davor, mindestens 1 mal, aber bis unendlich mal auftreten kann. das fragezeichen bedeutet, dass dieser text vorkommen
kann, aber nicht
muss.
ich kann dir ja mal weitere beispiele nennen, an welchem du die regulären ausdrücke verstehen kannst (und evtl. selbst nachbauen solltest). wenn du selbst welche erstellen willst, fang am besten mit den bb-code tags an. diese sind imo die einfachsten die es gibt und man kann an diesen schnell erlernen, wie eigentlich dieser länge smiley der welt funktioniert.
vllt mal ein paar weitere beispiele, an denen du üben (verstehen und nachbauen) kannst:
Code:
#\[img\](.*?)\[/img\]#si -> [ img]<url>[ /img]
\[img=http://(.*?)\]#si -> [ img=http://<url>]
\[url\]http://(.*?)\[img\]http://(.*?)\[/img\]\[/url\]#si -> [ url]http://<url>[ img]http://<url>[ /img][ /url]
\[url\]www.(.*?)\[img\]www.(.*?)\[/img\]\[/url\]#si -> [ url]www.<url>[ img]www.<url>[ /img][ /url]
\[url=http://(.*?)\]\[img\]http://(.*?)\[/img\]\[/url\]#si -> [ url=http://<url>][ img]http://<url>[ /img][ /url]
am einfachsten erlernst du es, wenn du dir mit php ein paar seiten parst. lies z.b. mal von heise.de alle news-titel heraus. oder lies mal alle bilder von einer seite aus. übung macht den meister ist hier die devise, denn anders lernst du es nicht.
irgendwann schaffst du es dann,
solche regulären ausdrücke zu schreiben (matcht eine valide email-adresse nach rfc 2822):
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?
?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?
?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]
?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
und so als tipp: am anfang bin ich auch verzweifelt, aber mittlerweile läuft das wie geschmiert.