Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: WebStyleBoard. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Freitag, 18. Oktober 2002, 15:26

Kleines RegExp Seminar

Also jüngst wurde ich von einigen Vertretern des WSB gebeten (nachdem ich mich förmlich aufgedrängt hatte), ein kleines Tutorial über Reguläre Ausdrücke (auch regular expressions - kurz RegExp) zu schreiben. Nun gesagt tun getät! ;) ... ich denke immerhin, dass diese Dinger so schlimm sie häufig aussehen, in vielen Bereichen bei PHP einfach unumgänglich sind. Evtl. wird dann auch meine Error-Klasse besser verstanden? ;)

Also was sind reguläre Ausdrücke

Nun interessant ist schon das Wort regulär... wat heißt das. Per Definition heißt eine Sprache regulär, falls es einen deterministisch endlichen Automaten gibt, der sie akzeptiert.
Jetzt ist die große Frage - was ist ein deterministisch endlicher Automat (kurz DEA). Der Memowe wirds bald wissen, weil er jetzt auch theoretische Informatik hat... die anderen können das getrost wieder vergessen ;) ...
Das ganze bedeutet für uns im Prinzip nichts anderes, dass es ein Alphabet gibt, was endlich ist und wir eine gewisse endliche Menge an Regeln haben, mit dem wir Wörter einer bestimmten Sprache erzeugen können. Hört sich evtl. auch noch etwas gestellzt an. Was sind Wörter, was ist Sprache, was sind Regeln... nuja. Als Wörter bezeichnet man. Die Zusammensetzung diverser "Buchstaben/Zeichen" eines Alphabets zu einem bestimmten Konstrukt. Z.B. liefert mir die Zusammensetzung von: H und a und l und l und o -> Hallo das Wort Hallo ;) - die Buchstaben stammen aus unserem ABC ... im kyrillischen Alphabet würde das auf eine ähnliche Weise funktionieren. Die Regeln nach der wir diese Buchstaben zusammensetzen können, sind quasi unsere Sprache (die deutsche momentan). Dieses feste Regelwerk ist zum Glück endlich, das heißt, dass ein Ausländer die Sprache Deutsch in endlicher Zeit quasi vollständig erlernen kann ;) - und das ist auch gut so. Also gibt es endlich viele Regeln mit denen wir unsere Wörter zusammensetzen können. Dieses Regelwerk kann man mithilfe eines Automaten umsetzen (nehmen wir jetzt mal so hin - wie das funktioniert, will ich nicht erklären - wenns so viele interessiert, kann ich das ja nachliefern - tut aber eigentlich nix zur Sache ;) ).
So jetzt hab ich son paar Begriffe erklärt - was aber noch nicht wirklich weiterhilft vermutlich. Wer jetzt immer noch Bahnhof versteht, hat also kein minderbemittelten Verstand.
Das Wörtchen regulär nochmal... angenommen ich habe jetzt eine eigene Sprache erfunden. Wenn ich z.B. eine Kundennummer auf eine ganz bestimmte Weise "kodieren, schreiben" will, dann muss ich zunächst feststellen: "kann ich diese Kundennummer mithilfe eines Automatens erzeugen?". Ist in der Kundennummer ein bestimmtes eindeutiges Muster zu finden... z.B. die ersten 3 Buchstaben sollen zwischen a und z liegen - gefolgt von einem großgeschriebenen B gefolgt von einem , und 4 Zahlen die zwischen 0 und 5 liegen können. Diese mündlichen Regeln definieren jetzt meine Sprache für die Kundennummer. Und da ich jetzt also quasi mündlich einen Automaten erstellt habe, ist diese Sprache regulär... wenn ich weiß, dass eine Sprache regulär ist, dann kann ich sie mithilfe eines regulären Ausdrucks bestimmen!

Ein regulärer Ausdruck ist also eine Möglichkeit ein bestimmtes Muster oder Verhalten eines bestimmten "Textes" (Sprache) zu definieren.
Beispiele sind dabei die obige Kundennummer, eine Email-Adresse, eine Internetadresse, das vorkommen von BBCode in einem Text ( [ B ] <- ist ein Wort der Sprache BBCode) usw...
Mit diesen regulären Ausdrücken kann man jetzt z.B. in einem Text suchen und gucken, welche Wörter in diesen Ausdruck passen. Der Ausdruck selbst ist also eine Art Schablone mit der ich meinen Text durchsuche und wenn die einzelnen Buchstaben durch die Schablone durchgucken, hab ich ein gültiges Wort gefunden! ;) - prima nicht?

Aufbau von regulären Ausdrücken

Nun die regulären Ausdrücke benutzen bestimmte Zeichen, um bestimmte Muster schneller "codieren" zu können. Diese Zeichen muss man im Prinzip kennen, wenn man einen Ausdruck aufbauen möchte.
Der Aufbau dieser Ausdrücke ähnelt einer sog. Backus Naur Form (Backus und Naur waren zwei Mathematiker), kurz BNF. Diese Form wird heute häufig dazu benutzt die Syntax diverser Programmiersprachen zu definieren. Auch z.B. bei php.net in der Dokumentation findet sich das (dazu später noch mehr...)

Allerdings ähnelt es auch nur... so richtig nu auch wieder nicht ;) ... also was haben wir für Zeichen:

Zeichenzusammensetzung

[...] <- die eckigen Klammern bedeuten, dass die darin enthaltenen Zeichen in dem Wort vorkommen müssen.
Gültig sind alle möglichen Kombinationen von Zeichen wie abcABdioe394

- <- der Bindestrich (minus) kürzt ab. Wenn man einen ganzen Bereich von Zeichen abdecken möchte, kann man das damit tun. Z.B. alle Buchstaben des "lateinischen" Alphabets: [a-z] ... dies umfasst nur die Kleinbuchstaben! ... [a-zA-Z] umfasst sowohl kleine als auch große Buchstaben. Dies umfasst übrigens keine Umlaute! Wenn man die auch noch möchte, kann man diese einfach mit in die eckige Klammer packen: [a-zA-ZöÖüÜäÄß] wären glaub ich so ziemlich alle die man dafür bräuchte ;)

\ <- das typische Maskierungszeichen, was man ja auch aus PHP kennt. Wenn ein Sonderzeichen gebraucht wird, welches selbst Teil der Beschreibungssprache für reguläre Ausdrücke ist, z.B. die [ Klammer ... muss man diese maskieren, damit der regExp weiß, das nachfolgende Zeichen ist jetzt keine Klammer so wie er sie verstehen würde, sondern halt ein Zeichen was in dem Ausdruck vorkommen kann. Beispiel: [a-z\[\]]
Das macht die Dinger auch häufig so unleserlich ;)

Man kann auch einfach ein beliebiges Wort (einer gesprochenen Sprache ;)) hinschreiben, wenn dieses komplett so in dem Ausdruck vorkommen soll:

auto <- gültige Wörter wären: auto aber auch autobahn oder autoaödifje - nicht aber z.B. AutO ...oder au


Quantifzierer
Jetzt kann man im Prinzip schon alle Zeichen des zur Verfügung stehenden Alphabets abdecken. Was schmerzlich fehlt, ist ein sog. Quantifzierer. Besondere Zeichen die Aussage darüber treffen, wie oft die geschriebenen Zeichen vorkommen sollen:

* <- der einfachste dieser Quantifizierer ist der * ... damit wird gesagt, dass die vorangegangenen Zeichen beliebig wiederholt werden dürfen und zwar auch 0 mal! Das heißt bei einem Ausdruck: [a-z]* sind mögliche Wörter die darauf passen: a, abc, adieudkek, hansmeiser oder auch (gar nix!). Gerne auch als das "leere Wort" bezeichnet.

"+" <- auch gerne genommen, bedeutet fast das gleiche wie oben - bis auf das gar nix ;) - also es kann die Zeichenfolge beliebig oft wiederholt werden, aber mindestens einmal muss sie schon vorkommen. Das sog. "leere Wort" darf nicht vorkommen: also wie oben: a, acbd ... aber nicht gar nix! Angenommen man hat jetzt ein HTML Eingabefeld und man würde auf [a-z] prüfen, dann wäre keine Eingabe schonmal falsch!

{ ... } <- die geschweiften Klammern geben eine numerische Möglichkeit der Quantifizierung. Mit nur einer Zahl:
{2} z.B. heißt das, dass der vorangeganene Ausdruck genau 2 Zeichen lang sein darf. Bei [a-z]{2} wären folglich gültige Wörter: aa, ab, ch, di... aber nicht a oder abc oder nix.

{2,5} würde dann wohl bedeuten? Man ahnt es ;) ... richtig: die Zeichenfolge muss zwischen 2 und 5 Zeichen haben: [a-z]{2,5} liefert folgendes: ab, abc, abieo aber nicht a oder kdiekd.

Man kann jetzt auch die hintere Zahl weglassen... damit ist die Maximale Beschränkung offen:
{2,} heißt also mindestens 2 Zeichen - aber darüberhinaus beliebig viele.
* kann man also auch so machen : {0,}
+ daher auch so: {1,}

Dann gibt es noch ? - was entweder 0 oder 1 bedeutet.

So das zu den Quantifzierern. Wir können jetzt also schon erste Ausdrücke bauen: [a-zA-Z0-9]{2,5} als Beispiel.. damit könnte man sich jetzt schon vorstellen ein HTML-Feld auf richtige Eingabe prüfen zu können.

Dazu kommen jetzt noch einige weitere Zeichen:

Anfang und Ende eines Wortes

^ <- bezeichnet den Anfang eines Wortes. Der darauf folgende Ausdruck bedeutet dann, dass er Amfang des Wortes genau so vorkommen muss.
Beispiel: ^[AUTO]{4} bedeuetet, dass alle Wörter mit den Buchstaben A,U,T,O und genau vier mal am Anfang beginnen müssen: gültig wäre AUTOfriedhof aber auch UTOAhausen. Nich aber hansAUTOMeiser... hans trifft nicht auf A, U, T, O zu und fällt damit raus...

$ <- bezeichnet das Ende des Wortes. Der voranstehende (!) Ausdruck muss am Ende des Wortes auftauchen... genau wie oben.

Beide Zeichen kann man natürlich auch kombinieren. Dann heißt das, dass die angegebenen Zeichen genau zwischen Anfang und Ende des Wortes auftauchen müssen. Die am häufigsten anzutreffende Form.
Beispiel: ^[0-9]+$ <- bedeutet von vorne bis hinten nur Zahlen zwischen 0 und 9. Nich sowas wie 9abc oder 999a ...
Wichtig ist dabei immer, dass man den Quantifizierer (+,*,?,{}) nich vergessen darf. Sonst ist der Ausdruck 1 Zeichen lang (es sei denn, man will genau das ;) )...

Jetzt haben wir noch sowas wie:

. <- das kann jedes Zeichen sein... wenn man einfach in einem Teil des Ausdrucks alle Zeichen zulassen möchte, einfache Möglichkeit. Sehr unsinniger Ausdruck: ^.*$ damit wäre alles zugelassen ;) selbst die leere Eingabe... sinnvoller wäre schonmal: ^.{2,5}$ zwar jede Eingabe zugelassen, aber immerhin zwischen 2 und 5 Zeichen...

| <- das Oder Zeichen, wie man es eigentlich überall kennt. Damit lassen sich halt logische Verknüpfungen bauen, wenn man z.B. Am Anfang eines Wortes sowohl Auto als auch Fahrrad haben möchte, einfach mit | trennen:
^Auto|Fahrrad ... würde ermöglichen: Autofahrer oder Fahrradfahrer. Jetzt erkennt man die nächste Schwierrigkeit... häufig ist nicht klar ersichtlich welche Zeichen jetzt eigentlich wo binden... das berühmte Punkt-Vor-Strich Dilemma ;) - daher auch hier gibts Klammern:

^(Auto|Fahrrad) macht das ganze gleich übersichtlicher für den Parser.

Und last but not least:

Wenn das ^ als erstes Zeichen vorkommt: [^0-9] negiert es den kompletten Ausdruck. Also richtig wären dann alle Zeichen außer 0-9!


Tolle Beispiele

Damit kann man jetzt schon jede Menge anstellen. Interessant ist jetzt halt die Kombination der Ausdrücke!

^[a-zA-Z]{2}\,[0-9]{1,5}B(12|15|17)$

Bedeutet angefangen wird mit zwei Buchstaben von a-z oder die Großbuchstaben. Gefolgt von einem , daraufhin 1 bis 5 Zahlen gefolgt von einem großen B und entweder 12, 15 oder 17... also z.B. cz,847B12 wäre ne prima gültige Eingabe ;)

wir können uns ja mal an was schickes heranwagen:
^[_.0-9a-z-]+@([0-9a-z][0-9a-z-] \.)+[a-z]{2,4}$

Es soll anfangen mit _ oder . oder 0-9 oder a-z oder - ... diese Zeichen müssen in irgendeiner Kombination mindestens einmal vorkommen (+) gefolgt von einem @ Zeichen gefolgt von einem Unterausdruck: der zunächst mit einem Zeichen 0-9a-z anfängt und dann gefolgt werden kann von mindestens einem Zeichen zwischen 0-9a-z und einem - daraufhin muss ein . folgen (\ Zeichen!) und der gesamte Unterausdruck muss mindestens einmal vorkommen und kann beliebig wiederholt werden (+)! Daraufhin wolgen nach dem letzten Punkt zwei bis vier Buchstaben zwichen a und z was auch die letzten Zeichen sein müssen.

Nun was kann das sein ;) ... richtig eine email-Adresse:
hans_meiser.trollo@redaktion2.a-b.rtl.de
wäre eine solche "matchbare" Email-Adresse...

es fällt auf, dass der reguläre Ausdruck nicht wirklich optimal ist... aber er ist eine gute Zwischenlösung und wird für die meisten Adressen passen...
Siehe dazu hier: http://www.php-faq.de/q/q-mail-adresse-gueltig.html


Abkürzungen

So was fehlt bislang noch? Vieles ;) ... ich pack nochmal was interessantes dazu - mit dem \ kann man nämlich neben dem Maskieren noch andere Sonderfunktionen ausführen.

\d <- definiert eine beliebige Dezimalzahl
\D <- alles was keine Dezimalzahl ist
\s <- ein Leerzeichen
\S <- alles - nur kein Leerzeichen ;)
\w <- alles was ein Perl-Wort ist! Ein Perl Wort alles was Zahl _ Buchstabe ist... nur keine Sonderzeichen...

\W <- wieder das Gegentum...

diese Dinger sind ganz praktisch bei der Abkürzung...


Modifier, Delimiter

so und dazu kommt jetzt noch eine Besonderheit der Perl-Schreibweisen... jeder reguläre Ausdruck muss in sog. Delimiter gefasst werden - auch Trennzeichen gennant, die den regulären Ausdruck einklammern und danach dann einen Sonderschalter ermöglichen.
In der Funktion preg_match z.B. muss ein Ausdruck in / ... / eingefasst sein:
"/^[a-z]{3}$/" <- wäre jetzt ein richtiges "Pattern" (Muster) ... und jetzt gibts noch die typischen Schalter - der wichtigste ist:
/^[a-z]{3}$/i

das /i <- bedeutet case insensitive - also Egal ob Groß- oder Kleinschreibung!


Finish!

So das sollte es erstmal gewesen sein - ich hab bei weitem nicht alle Möglichkeiten rausgefischt... nur die Wichtigsten, wie ich finde. Wenn jemand noch Ergänzungen kennt, mag er das ja vorbringen ;)

Einige weiterführende Links noch:
http://de3.php.net/manual/en/reference.p…tern.syntax.php
(sehr ausführlich und mit einigen Beispielen aber auf englisch!)

http://www.php-faq.de/q/q-regexp-bauelemente.html
etwas kürzer als mein Text glaub ich ;) - etwas knapper gehalten, aber er geht noch auf die sog. Backreferences ein, die ich erstmal weggelassen hab. Die sind noch so a schmankerl.. aber man kann darauf auch verzichten ;) - vielleicht schreib ich da später noch was dazu. Vorerst war das genug :hupferl:

Viel Spaß beim Lesen und Ausprobieren ;)


Edit: Warum zum Geier verschluckt das Teil meine Plus-Zeichen???? ... wir hatten doch schonmal sowas wie 2 5 oder? ;) ... was ist hier faul?

Edit2: keine Ahnung was da nicht stimmte... jetzt jedenfalls geht's und ich hab's mal korrigiert!
Signatur von »Snoop« The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offence.
-- Edsger W. Dijkstra, SIGPLAN Notices, Volume 17, Number 5 (11.05.1930 - 07.08.2002)

Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von »Snoop« (14. Dezember 2004, 08:52)


2

Freitag, 18. Oktober 2002, 15:41

Hey Snoop,

super! Hätte nicht gedacht das du das so schnell hinbekommst :D


Tobias
P.S. Vielleicht schreib ich gleich noch eine kleine Ergänzung zu deinem Text die beschreibt wie man das ganze nun auf Php anwendet.
Signatur von »t-ob-i« {SIGNATUR}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »t-ob-i« (18. Oktober 2002, 15:58)


3

Freitag, 18. Oktober 2002, 15:43

Na toll! Vielen herzlichen Dank :evil: X( ;)

da freut man sich, dass man in der praxisphase is und wird von dir wieder an die theoriphase des studiums erinnert (BNF, Automatentheorie, ...).

tolle leistung!


nichtsdestotrotz find ich deinen Beitrag extremst wertvollst, nicht zuletzt deshlab weil er auf deutsch und verständlich ist (letzteres kommt ja leider nicht so oft vor bei erläuterungen zu irgendwas; nicht auf dich bezogen).
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

4

Freitag, 18. Oktober 2002, 16:10

Hallo!

Ich bedanke mich schonmal im Voraus. :))

Ich habe zwar im Moment nicht den Nerv dazu, mir diese sehr ausführlichen Informationen anzueignen, aber die ersten Zeilen stiften doch Vorfreude. :D


Chacabaou.

5

Freitag, 18. Oktober 2002, 16:16

;) danke für die Blumen... - dummerweise will das Plus-Zeichen bei mir nicht... woran kann das liegen? Das hab ich dann doch an einigen Stellen benutzt. Wäre doch toll, wenn das klappen würd'

Bei Formulierungen... ich geb mir mühe ;) - das ist aber leider wirklich nicht soo einfach. Passiert mir ja auch immer wieder, dass man anfängt etwas zu erklären und dann wird's doch immer komplizierter und man kriegt die Kurve nicht mehr ;)

Um richtig fit zu werden mit RegExps sollte man einfach a bisserl üben - nen HTML Formular überprüfen etc... z.B. die Uhrzeit in Regexps eingeben... oder die Alterseingabe überprüfen... Internetseiten checken.. mehrere Alternativen finden etc.!
Signatur von »Snoop« The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offence.
-- Edsger W. Dijkstra, SIGPLAN Notices, Volume 17, Number 5 (11.05.1930 - 07.08.2002)

6

Montag, 25. November 2002, 17:02

hübsch gemacht, snoop :) *schieb*

-> nachtrag: die Delimiter von preg_match() müssen keine schrägstriche sein (so wie es der artikel meines geschätzten vorposters Mr. Snoop impliziert) sondern können jedes beliebiges Sonderzeichen sein.
Um genau zu sein hab ich mir angewöhnt die Schrägstriche gerade nicht zu nehmen, da sie nicht sonderlich begrenzungsmäßig aussehen (;)) und viel zu oft in der reg-exp selber vorkommen. Schöner ist da schon der senkrechte Strich | (wird aber auch oft gebraucht) oder mein derzeitiger favorit das #
Als Delimiter wird einfach das erste Zeichen benutzt (solange es kein Buchstabe/Zahl/Backslash ist)

anstatt von
"/^[a-z]{3}\/[a-z]{5}$/iU"
ist doch
"#^[a-z]{3}/[a-z]{5}$#iU"
schon wesentlich übersichtlicher ;)


Gorgonzola
P.S.: Es ist wirklich schön wenn in einer übelst langweiligen theor.Informatikgrundlagenvorlesung wenigstens ein Wort fällt was einem bekannt vorkommt, vorallem wenn das dann "regulärer Ausdruck" ist und man sich einbilden kann das ganze hätte sogar Praxisbezug ;)
Signatur von »Gorgonzola« There is a theory which states that if ever anyone discovers what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre.
There is another theory which states that this has already happened.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Gorgonzola« (25. November 2002, 17:03)


7

Montag, 25. November 2002, 17:40

Hi Gorgo - schön dich hier zu sehen! :)

In der Tat - der Delimiter ist egal... das hatte ich später nochmal nachgelesen - hatte in den Beispielen nur immer / gesehen und dann einfach übernommen. Nunja - equal ;)

zu Theo. Inf... genau so ging's mir auch ;) ... bei uns haben die dann tatsächlich ne Aufgabe gemacht in der man reguläre Ausdrücke in Lex (ein Unix-Tool - gerne benutzt in C-Programmen für RegExps) schreiben sollte. Das war doch prima ;)
Signatur von »Snoop« The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offence.
-- Edsger W. Dijkstra, SIGPLAN Notices, Volume 17, Number 5 (11.05.1930 - 07.08.2002)

8

Dienstag, 26. Oktober 2004, 13:32

hallo,

ich habe den beitrag schon vor längerer zeit einmal gelesen und nur bahnhof verstanden :D
aber als ich jetzt zufällig wieder vorbei gesehen habe erscheint mir alles eh ziemlich verständlich und ein tolles system zu haben *freu*

das tutorial hat mir sehr weitergeholfen und ich kann mich jetzt an schwierigere aufgaben herwanwagen...

danke snoop!
Signatur von »johnny« vanus | ichigo | switcher

9

Mittwoch, 27. Oktober 2004, 18:49

Hey Prima ;) - freut mich, wenn ich helfen konnte...
Signatur von »Snoop« The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offence.
-- Edsger W. Dijkstra, SIGPLAN Notices, Volume 17, Number 5 (11.05.1930 - 07.08.2002)

10

Montag, 13. Dezember 2004, 17:20

RE: Kleines RegExp Seminar

Ich habe mir das jetzt zum vierten mal durchgelesen, na sagen wir drei mal überflogen und ein mal jetzt richtig gelesen. Mir ging es ähnlich wie johnny.
Ich werde die regulären Ausdrücke dann bei Gelegenheit mal versuchen anzuweden, Beispiele gibt es ja in deinem Text genug.

Zitat von »Snoop«


Einige weiterführende Links noch:
http://www.php.net/manual/de/pcre.pattern.syntax.php
(sehr ausführlich und mit einigen Beispielen aber auf englisch!)


Dieser Link gibt bei mir en 404er. Wenn die Seite umgezogen ist, würde ich mich über den neuen Link freuen. ;)
Signatur von »oop1« _________

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »oop1« (13. Dezember 2004, 17:21)


11

Montag, 13. Dezember 2004, 17:33

http://de3.php.net/manual/en/reference.p…tern.syntax.php

nicht vom /en in der adresse verwirren lassen, du kannst zwar statt dessen auch /de nehmen, aber deutscher wird die seite dadurch auch nicht *g*
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

12

Dienstag, 14. Dezember 2004, 08:53

Jo - seit der neuen php-Version hat sich da wohl etwas geändert in der Linkstruktur ;) ... danke für den Hinweis. Habs jetzt auch geändert...

viel Spaß beim Regexpen ;)
Signatur von »Snoop« The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offence.
-- Edsger W. Dijkstra, SIGPLAN Notices, Volume 17, Number 5 (11.05.1930 - 07.08.2002)

13

Dienstag, 14. Dezember 2004, 15:55

RE: Kleines RegExp Seminar

Zitat von »Snoop«


{2,5} würde dann wohl bedeuten? Man ahnt es ;) ... richtig: die Zeichenfolge muss zwischen 2 und 5 Zeichen haben: [a-z]{2,5} liefert folgendes: ab, abc, abieo aber nicht a oder kdiekd.


Das wollte ich mal mit der Funktion pregmatch auspobieren.
Der Reguläre ausdruck bzw der PHP code sieht so aus

PHP-Quelltext

1
2
3
4
5
6
7
<?php

if (preg_match("/[a-z]{2,5}/i","teststring") )
{ echo "gefunden";
}

?>

Mit dem i habe ich die klein/großscheibug abgeschaltet.
Eigenltlich sollte dieser Ausdruck ja bei allen Zeichenketten die
zwischen 2 und 5 zeichen lang sind und aus A-Z oder a-z bestehen TRUE liefern.
Wenn ich dieses PHPscript so starte, wird aber auch gefunden ausgegeben.

Wenn ich aber

PHP-Quelltext

1
2
3
if (preg_match("/[a-z]{2,5}/","t") )
{ echo "gefunden";
}


eingebe,
wird nichts ausgegeben, da' t' ja nur ein Zeichen hat. So sollte es ja auch sein.
Was habe ich denn bei dem Ausdruck oben falsch gemacht? :wallbash:

PS:Noch ne Linkänderung: http://www.dclp-faq.de/ ist mittlerweile ne Filesharingseite
Signatur von »oop1« _________

14

Dienstag, 14. Dezember 2004, 16:07

RE: Kleines RegExp Seminar

Zitat von »oop1«

Zitat von »Snoop«


{2,5} würde dann wohl bedeuten? Man ahnt es ;) ... richtig: die Zeichenfolge muss zwischen 2 und 5 Zeichen haben: [a-z]{2,5} liefert folgendes: ab, abc, abieo aber nicht a oder kdiekd.
"muss" ist nicht zu 100% korrekt.
Du erfasst damit einen zwischen 2 und 5 zeichen langen Substring, der aus Buchstaben besteht.
Du sagst aber nicht, dass der der komplette String nur 2 - 5 Zeichen lang sein darf

Zitat

PHP-Quelltext

1
2
3
4
5
6
7
<?php

if (preg_match("/[a-z]{2,5}/i","teststring") )
{ echo "gefunden";
}

?>



Mit dem i habe ich die klein/großscheibug abgeschaltet.
Eigenltlich sollte dieser Ausdruck ja bei allen Zeichenketten die
zwischen 2 und 5 zeichen lang sind und aus A-Z oder a-z bestehen TRUE liefern.
Wenn ich dieses PHPscript so starte, wird aber auch gefunden ausgegeben.
siehe Erklärung oben, preg_match findet hier tests

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$test 'teststring';
if (preg_match('%^[a-z]{2,5}$%i'$test))
  echo '$teststring besteht aus 2 - 5 Buchstaben.';
else
  echo '$teststring besteht nicht aus 2 - 5 Buchstaben.';
echo '<br />';

if (preg_match('%[a-z]{2,5}%i'$test))
  echo '$teststring enthält 2 - 5 aufeinander folgende Buchstaben.';
else
  echo '$teststring enthält nicht 2 - 5 aufeinander folgende Buchstaben.';
?>
Mein erstes Pattern enthält noch die Zeichen ^und $, wodurch der Text mit 2-5 Buchstaben beginnen muss (das kommt vom ^) und nach den 2-5 Buchstaben darf nichts mehr kommen (angegeben durch das $)
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »mrhappiness« (14. Dezember 2004, 16:08)


15

Dienstag, 14. Dezember 2004, 16:08

RE: Kleines RegExp Seminar

Du darfst hier gern Lob+Kritik zu diesem Beitrag loswerden.
Fragen dazu bitte im entsprechenden Forum (zb PHP) stellen.


Danke

(Dieser Spruch steht jetzt unter jedem Tutorial, denn es macht keinen Sinn ein Tutorial zu schreiben und den geneigten Leser durch "wilde Diskussionen" zu verwirren.)

PS: oop1 ... bitte einfach im PHP-Forum nen neues Thema anfangen ... Danke :)
Signatur von »TheNobody Style«

16

Donnerstag, 16. Dezember 2004, 15:06

RE: Kleines RegExp Seminar

Zitat von »oop1«


PS:Noch ne Linkänderung: http://www.dclp-faq.de/ ist mittlerweile ne Filesharingseite

deswegen war ich mal so frei und hab die beiden Links in php-faq.de gändert ... :)
Signatur von »TheNobody Style«