U S E R - A R C H I V

Seite: Regex

Regex-Muster Archive

Suchbegriff: Regex Typ: Skriptarchiv
http://aspn.activestate.com/ASPN/Cookbook/Rx/
Rubrik: Programmieren; Typ: Skriptarchiv
http://regexlib.com/
Rubrik: Programmieren; Typ: Skriptarchiv
http://www.bigbold.com/snippets/tag/regex
Rubrik: Programmieren; Typ: Skriptarchiv
http://www.bigbold.com/snippets/
Rubrik: Webseiten; Typ: Skriptarchiv
http://www.inspire-world.de/perlcgi/schnipsel/codeschnipselregexe.html
Rubrik: Webseiten; Typ: Skriptarchiv
http://www.inspire-world.de/perlcgi/schnipsel/codeschnipselregexe.html
Rubrik: Webseiten; Typ: Skriptarchiv

Aus der User-Archiv-Datenbank: Alle Einträge (Online-Literatur, Portale, Foren, FAQs etc)

Suchbegriff: regex
http://blog.egovernment.krzn.de/2010/09/17/anleitung-mit-yahoo-pipes-web-2-0-barrierefrei-ins-stadtportal-integrieren/
Rubrik: Internet; Typ: Sonstige_Literatur
http://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://id.kihiwi.de/WladiD/Kis/Kann_ich/KiHiWi.36/Post.432/index.html
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://www.cgicorner.ch/tutor/11_regexp.shtml
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://www.fachhefte.ch/hans_haesler_d_2007/FGI_4-07_d.pdf
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://www.infos24.de/phpe/handbuch/6_php_regular_expression.htm
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://www.aboutwebdesign.de/awd/content/1107290248.shtml
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://www.goldmann.de/regular-expression-regex-praxis_tipp_420.html
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://www.regex-tester.de/regex_example.html
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://www.oreilly.de/catalog/regex2ger/chapter/ch05.pdf
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://aspn.activestate.com/ASPN/Cookbook/Rx/
Rubrik: Programmieren; Typ: Skriptarchiv
http://regexlib.com/Rss.aspx
Rubrik: Sonstige Themen; Typ: RSS-Feeds
http://regexlib.com/
Rubrik: Programmieren; Typ: Skriptarchiv
http://regexlib.com/CheatSheet.aspx
Rubrik: Programmieren; Typ: Referenzen
http://www.ooowiki.de/Regul%C3%A4rerAusdruck
Rubrik: Sonstige Themen; Typ: Sonstige_Literatur
http://www.bigbold.com/snippets/tag/regex
Rubrik: Programmieren; Typ: Skriptarchiv
http://webdesignblog.de/webdesign/webdesign-guide-modrewrite-und-htaccess/
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://regexp-evaluator.de/tutorial/
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://www.handcode.de/php/aki-1/index.php?src=regex1.xml
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://www.php-dummies.de/script/Tutorials/RegExpressions/Basics.html
Rubrik: Webseiten; Typ: Tutorials
http://www.tekromancer.com/perl2/7.html
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://www.bigbold.com/snippets/
Rubrik: Webseiten; Typ: Skriptarchiv
http://www.devmag.net/webprog/regulaere_ausdruecke.htm
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://www.andreas-kalt.de/blog/webwork/modrewrite-entraetselt
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://www.regular-expressions.info/wordboundaries.html
Rubrik: Programmieren; Typ: Portal
http://etext.lib.virginia.edu/services/helpsheets/unix/regex.html
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://weitz.de/regex-coach/
Rubrik: Programmieren; Typ: Onlinetools
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://tut.php-q.net/regex.html
Rubrik: Webseiten; Typ: Tutorials
http://www.modrewrite.de/13.9.0.0.1.0.phtml
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://de.wikipedia.org/wiki/Regex
Rubrik: Programmieren; Typ: Referenzen
http://ffm.junetz.de/members/reeg/DSP/node16.html
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://www.php-resource.de/tutorials/read/10/1/
Rubrik: Webseiten; Typ: Sonstige_Literatur
http://www.lrz-muenchen.de/services/schulung/unterlagen/regul/
Rubrik: Webseiten; Typ: Tutorials
http://pcre.nophia.de/evaluate/index.php
Rubrik: Webseiten; Typ: Onlinetools
http://pcre.nophia.de/explain/index.php
Rubrik: Webseiten; Typ: Tutorials
http://www.amk.ca/python/howto/regex/regex.html
Rubrik: Sonstige Themen; Typ: Tutorials
http://de3.php.net/manual/de/reference.pcre.pattern.syntax.php
Rubrik: Sonstige Themen; Typ: Referenzen
http://www.regular-expressions.info/
Rubrik: Sonstige Themen; Typ: Portal
http://www.sql-und-xml.de/regex/
Rubrik: Programmieren; Typ: Tutorials
http://www.inspire-world.de/perlcgi/schnipsel/codeschnipselregexe.html
Rubrik: Webseiten; Typ: Skriptarchiv
http://www.inspire-world.de/perlcgi/schnipsel/codeschnipselregexe.html
Rubrik: Webseiten; Typ: Skriptarchiv
http://www.coding-board.de/board/forumdisplay.php?f=63
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://www.coding-board.de/board/forumdisplay.php?f=63
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://regexlib.com/
Rubrik: Programmieren; Typ: Sonstige_Literatur
http://www.regenechsen.de/regex_de/regex_1_de.html
Rubrik: Programmieren; Typ: Tutorials
http://luke.piranho.com/stil/tutorials/php/regex4.htm
Rubrik: Programmieren; Typ: Sonstige_Literatur

Neueste REGEX-Patterns auf regexlib.com

Bücher zum Thema Reguläre Ausdrücke

Wikipediaseite zu REGEX (Reguläre Ausdrücke)

http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck

Dieser Artikel basiert auf dem Artikel aus der freien Enzyklopädie Wikipedia und steht unter der GNU-Lizenz für freie Dokumentation. In der Wikipedia ist eine Liste der Autoren verfügbar.



Regulärer Ausdruck

aus Wikipedia, der freien Enzyklopädie

Wechseln zu: Navigation, Suche

In der Informatik ist ein Regulärer Ausdruck (Abk. RegExp oder Regex, engl. regular expression) eine Zeichenkette, die der Beschreibung von Mengen beziehungsweise Untermengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. Reguläre Ausdrücke finden vor allem in der Softwareentwicklung Verwendung; für fast alle Programmiersprachen existieren Implementierungen.

Allgemein gesprochen stellen reguläre Ausdrücke erstens eine Art Filterkriterium für Texte dar, in dem der Ausdruck in Form eines Musters mit dem Text abgeglichen wird. So ist es beispielsweise möglich, alle Wörter, die mit S beginnen und mit D enden zu finden, ohne die zwischenliegenden Buchstaben vorgeben zu müssen. Auf diese Art kann beispielsweise die Syntax einer Programmiersprache geprüft werden, in der der Quelltext eines Programms mit dem (dann vergleichsweise komplexen) regulären Ausdruck, der die Syntax der Programmiersprache beschreibt, abgeglichen wird - bleibt etwas im Quelltext an dem Filter hängen, so hat sich ein Syntaxfehler in den Quelltext eingeschlichen.

Zweitens lassen sich aus regulären Ausdrücken, als eine Art Schablone, auch Mengen von Wörtern erzeugen, ohne jedes Wort einzeln angeben zu müssen. So lässt sich beispielsweise ein Ausdruck angeben, der alle denkbaren Zeichenkombinationen (Wörter) erzeugt, die mit S beginnen und mit D enden.

Inhaltsverzeichnis

Verbergen

Reguläre Ausdrücke in der theoretischen Informatik

Theoretische Grundlagen

Hinweis: In diesem Abschnitt wird die Kenntnis einiger Konzepte der Theorie der formalen Sprachen vorausgesetzt.

Reguläre Ausdrücke beschreiben eine Familie von formalen Sprachen und gehören damit zur Theoretischen Informatik. Hier bilden sie die unterste und somit ausdrucksschwächste Stufe der Chomsky-Hierarchie (Typ-3). Es lässt sich zeigen, dass zu jedem regulären Ausdruck ein gleichwertiger endlicher Automat existiert und umgekehrt. Dieser Automat ist einfach bestimmbar. Hieraus folgt die relativ einfache Implementierbarkeit regulärer Ausdrücke.

Der Mathematiker Stephen Kleene benutzte eine Notation, die er reguläre Mengen nannte. Die Mächtigkeit regulärer Ausdrücke reicht aus, um die Morphologie einer natürlichen Sprache zu beschreiben.

Reguläre Ausdrücke unterstützen genau drei Operationen: Alternative, Aneinanderreihung und Wiederholung. Die formelle Definition sieht folgendermaßen aus:

Syntax

  1. \underline\varnothing (die leere Menge) ist ein regulärer Ausdruck.
  2. \underline\epsilon (das leere Wort) ist ein regulärer Ausdruck.
  3. \forall a_{i} \in \Sigma ist \underline{a_i} (jedes Zeichen aus dem zugrundeliegenden Alphabet) ein regulärer Ausdruck.
  4. Sind x und y reguläre Ausdrücke, so auch (x \cup y) (Vereinigung), (xy) (Konkatenation) und x * (Stern-Operator).
  5. Es gibt keine weiteren regulären Ausdrücke.

Anwendung regulärer Ausdrücke

Ken Thompson nutzte diese Notation um qed (eine Vorgängerversion des Unix-Editors ed) zu bauen und später das Werkzeug grep zu schreiben. Seither implementieren sehr viele Programme und Bibliotheken von Programmiersprachen Funktionen, um reguläre Ausdrücke zum Suchen und Ersetzen von Zeichenketten zu nutzen. Beispiele dafür sind die Programme sed, grep, emacs und Bibliotheken der Programmiersprachen C, Perl, Java, auch die Textverarbeitung des Office-Paketes OpenOffice.org bietet die Möglichkeit, mit regulären Ausdrücken im Text zu suchen.

Einige Programmiersprachen wie z. B. Perl unterstützen einige Erweiterungen der regulären Ausdrücke, z. B. Rückwärtsreferenzen. Hierbei handelt es sich nicht mehr um reguläre Ausdrücke im Sinne der theoretischen Informatik, denn die so erweiterten Ausdrücke gehören nicht mehr notwendigerweise zum Typ 3 der Chomsky-Hierarchie.

Elemente, mit denen sich ein regulärer Ausdruck festlegen lässt

Die folgenden Syntaxbeschreibungen beziehen sich auf die Syntax der gängigen Regex-Implementierungen mit Erweiterungen, sie entsprechen also nur teilweise der obigen Definition aus der theoretischen Informatik.

Eine häufige Anwendung regulärer Ausdrücke besteht darin, spezielle Zeichenketten in einer Menge von Zeichenketten zu finden (matchen, von englisch "to match"). Die im Folgenden angegebene Beschreibung ist eine (oft benutzte) Konvention, um Konzepte wie Zeichenklasse, Quantifizierung, Verknüpfung und Zusammenfassen konkret zu realisieren. Hierbei wird ein regulärer Ausdruck aus den Zeichen des zugrunde liegenden Alphabets in Kombination mit sogenannten Metazeichen ([, ], (, ), {, }, |, ?, +, *, ^, $, \, .) gebildet. Alle übrigen Zeichen des Alphabets stehen für sich selbst.

Zeichenliterale

Diejenigen Zeichen, die direkt (wörtlich, literal) übereinstimmen müssen, werden auch direkt notiert. Je nach System gibt es auch Möglichkeiten, den Oktal- oder Hexadezimalcode anzugeben.

Beliebiges Zeichen

  • . : Ein Punkt bedeutet, dass an seinem Platz ein (fast) beliebiges Zeichen stehen kann. Abhängig vom verwendeten Programm oder dessen Einstellungen kann ein Punkt auch für Newline (Zeilenumbruch) stehen. Die meisten Implementierungen sehen standardmäßig Newline nicht als beliebiges Zeichen an, jedoch kann in einigen Programmen mithilfe des sogenannten s-Modifiers (z. B. in /foo.bar/s) ebendies erreicht werden.

Ein Zeichen aus einer Auswahl

Mit eckigen Klammern lässt sich eine Zeichenauswahl definieren. Der Ausdruck in eckigen Klammern steht dann für genau ein Zeichen aus dieser Auswahl (Einzeichenmuster).

Beispiele:

[egh] eines der Zeichen „e“, „g“ oder „h“
[0-6] eine Ziffer von „0“ bis „6“ (Bindestriche sind Indikator für einen Bereich)
[A-Za-z0-9] ein beliebiger lateinischer Buchstabe oder eine beliebige Ziffer
[^a] ein beliebiges Zeichen außer „a“ („^“ am Anfang einer Zeichenklasse negiert selbige)

In vielen neueren Implementationen können innerhalb der eckigen Klammern nach POSIX auch Klassen angegeben werden, die selbst wiederum eckige Klammern enthalten. Sie lauten beispielsweise:

[:alnum:]    Alphanumerische Zeichen: [:alpha:] und [:digit:].
[:alpha:] Buchstaben: [:lower:] und [:upper:].
[:blank:] Leerzeichen und Tabulator.
[:cntrl:] Steuerzeichen. Im ASCII sind das die Zeichen 00 bis 1F, und 7F (DEL).
[:digit:] Ziffern: 0, 1, 2,... bis 9.
[:graph:] Graphische Zeichen: [:alnum:] und [:punct:].
[:lower:] Kleine Buchstaben1: nicht notwendig nur von a bis z.
[:print:] Druckbare Zeichen: [:alnum:], [:punct:] und Leerzeichen.
[:punct:] Zeichen wie: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ .
[:space:] Whitespace: Horizontaler und vertikaler Tabulator, Zeilen- und Seitenvorschub, Wagenrücklauf und Leerzeichen.
[:upper:] Großbuchstaben1: nicht notwendig nur von A bis Z.
[:xdigit:] Hexadezimale Ziffern: 0 bis 9, A bis F, a bis f.

1Was Buchstaben sind, ist im Allgemeinen locale-abhängig.[1]

Vordefinierte Zeichenklassen

Es gibt vordefinierte Zeichenklassen, die allerdings nicht von allen Implementationen unterstützt werden, da sie lediglich Kurzformen sind und auch durch eine Zeichenauswahl beschrieben werden können. Wichtige Zeichenklassen sind:

  • \d : eine Ziffer [0-9]
  • \D : keine Ziffer [^0-9]
  • \w : ein Buchstabe, eine Ziffer oder der Unterstrich [a-zA-Z_0-9]
  • \W : kein Buchstabe, keine Zahl und kein Unterstrich [^\w]
  • \s : Whitespace, meistens [ \f\n\r\t\v]
  • \S : alle Zeichen außer Whitespace [^\s]

Quantoren (Angabe der Anzahl Wiederholungen)

Quantoren (auch Quantifizierer oder Wiederholungsfaktoren) erlauben es, den vorherigen Ausdruck in verschiedener Vielfachheit in der Zeichenkette zuzulassen:

  • ? : Der voranstehende Ausdruck ist optional, er kann einmal vorkommen, muss es aber nicht, d. h. der Ausdruck kommt null- oder einmal vor. (Dies entspricht {0,1} )
  • + : Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen. (Dies entspricht {1,} )
  • * : Der voranstehende Ausdruck darf beliebig oft (auch keinmal) vorkommen. (Dies entspricht {0,} )
  • {n} : Der voranstehende Ausdruck muss exakt n-mal vorkommen.
  • {min,} : Der voranstehende Ausdruck muss mindestens min-mal vorkommen.
  • {,max} : Der voranstehende Ausdruck darf maximal max-mal vorkommen.
  • {min,max} : Der voranstehende Ausdruck muss mindestens min-mal und darf maximal max-mal vorkommen.

Die Quantoren beziehen sich dabei auf den regulären Ausdruck, jedoch nicht zwangsläufig auf die durch ihn gematchte Zeichenkette. So wird zwar z.B. durch a+ ein "a" oder auch "aaaa" gematcht, jedoch matcht [0-9]+ nicht nur sich wiederholende gleiche Ziffern, sondern auch Folgen gemischter Ziffern, z.B. "072345".

Weitere Beispiele sind:

  • [ab]+ passt auf "a", "b", "aa", "bbaab" etc.
  • [0-9]{2,5} matcht zwei, drei, vier oder fünf Ziffern in Folge, z. B. "42", "54072", jedoch nicht z. B. die Zeichenfolgen "0", "1.1" oder "a1a1".

Soll eine Zeichenkette nur aus dem gesuchten Muster bestehen (und es nicht nur enthalten), so muss in den meisten RegExp-Implementierungen explizit definiert werden, dass das Muster von Anfang (^ oder \A) bis zum Ende der Zeichenkette ($ oder \z) reichen soll, ansonsten matcht z.B. [0-9]{2,5} auch bei der Zeichenkette "1234507" die Teilzeichenkette "12345". Aus dem gleichen Grund würde bspw. a* immer matchen, da jeder String, selbst der leere "", mind. 0-mal das Zeichen "a" enthält.

Gieriges Verhalten

Normalerweise wird von einem regulären Ausdruck die größtmögliche passende Zeichenkette ausgewählt, weshalb dieses Verhalten als „gierig“ (engl.: „greedy“) bezeichnet wird. Da dieses Verhalten jedoch nicht immer so gewollt ist, lassen sich bei manchen neueren RegEx-Implementierungen Quantoren als „genügsam“ bzw. engl. „non-greedy“ (also „nicht gierig“) deklarieren. Hierfür wird dem Quantor ein Fragezeichen ? nachgestellt. Die Implementierung von genügsamen Quantoren ist vergleichsweise aufwändig, weshalb nicht alle Parser diese unterstützen. Der durch das angehängte Fragezeichen entstehende Ausdruck führt bei herkömmlichen RegEx-Implementierungen zu einer Fehlermeldung oder wird ignoriert.

Beispiel:

  • Angenommen es wird auf den String "ABCDEB" der reguläre Ausdruck A.*B angewendet, so würde er den kompletten String "ABCDEB" finden. Mit Hilfe des "non-greedy"-Quantors "*?" passt der neue Ausdruck, also A.*?B, nur auf die Zeichenkette "AB", bricht also die Suche nach dem ersten gefundenen "B" ab.

Gruppierung mit runden Klammern

Ausdrücke lassen sich mit runden Klammern ( und ) zusammenfassen: Etwa erlaubt "(abc)+" ein "abc" oder ein "abcabc" etc.

Einige Programme speichern die Gruppierung ab und ermöglichen deren Wiederverwendung im Regulären Ausdruck oder bei der Textersetzung: Ein Suchen und Ersetzen mit

AA(.*?)BB

als Regulären Suchausdruck und

\1

als Ersetzung ersetzt alle Zeichenketten, die von AA und BB eingeschlossen sind, durch den zwischen AA und BB enthaltenen Text. D. h. AA und BB und das dazwischen wird ersetzt durch das dazwischen, also fehlen AA und BB im Ergebnis. \1, \2 usw. nennt man Rückwärtsreferenzen (engl. "Backreferences"). \1 bezieht sich auf das erste Klammerpaar, \2 auf das zweite usw.; dabei zählt man die öffnenden Klammern.

Interpreten von regulären Ausdrücken, die Rückwärtsreferenzen zulassen, entsprechen nicht mehr dem Typ 3 der Chomsky-Hierarchie. Mit dem Pumping-Lemma (= Pumplemma) lässt sich einfach zeigen, dass folgender regulärer Ausdruck, der feststellt, ob in einem String vor und nach der 1 die gleiche Anzahl von 0 steht, keine reguläre Sprache ist.

^(0*)1\1$

Alternativen

Man kann alternative Ausdrücke mit dem "|"-Symbol zulassen:

  • "(ABC|abc)" bedeutet "ABC" oder "abc", aber z. B. nicht "Abc".

Weitere Zeichen

Um die oft auf Zeichenketten bezogenen Anwendungen auf dem Computer zu unterstützen, werden in der Regel zusätzlich zu den bereits genannten die folgenden Zeichen definiert:

  • ^ steht für den Zeilenanfang (nicht zu verwechseln mit „^“ bei der Zeichenauswahl mittels „[“ und „]“).
  • $ kann je nach Kontext für das Zeilen- oder Stringende stehen.
  • \ hebt gegebenenfalls die Metabedeutung des nächsten Zeichens auf. Beispielsweise lässt der Ausdruck „(A\*)+“ die Zeichenketten „A*“, „A*A*“ etc. zu und lässt sich ein Punkt, „.“, mit „\.“ suchen.
  • \b steht für die leere Zeichenkette am Wortanfang oder am Wortende.
  • \B steht für die leere Zeichenkette, die nicht den Anfang oder das Ende eines Wortes bildet.
  • \< steht für die leere Zeichenkette am Wortanfang.
  • \> steht für die leere Zeichenkette am Wortende.

RegExp-Tutorial von Jens Henneberg

Links zu den Kapiteln auf http://regexp-evaluator.de/tutorial/

Liste der REGEX-Elemente

REGEX Cookbook

http://aspn.activestate.com/ASPN/Cookbook/Rx/

Übersicht nach Kategorien

Telecommunications


 

Random Password Generator By Rohit D'souza (rohit d'souza)
Its help to generate Unique 10 character password on every reload of the page
Modified: 2006/06/23 06:59

Flexible Random Password Generation (Satyam Sinha)
This script can generate a random password between a certain minimum and maximum length.
Modified: 2006/05/30 06:52

Multi Dimesional Array Program Code in Perl By Rohit D'souza (rohit d'souza)
it helps u learn how to create multidimesional arrays in perl using array references and then how ...
Modified: 2006/05/05 04:10

(Alexander Zavorotniy)
Modified: 2005/07/01 21:53

Finding Palindromes (David Baird)
Use this reqular expression to find palindromes, sentences or words which are the same written ...
Rated: 3 out of 5 by 1 user(s), Modified: 2004/11/02 02:17

buffgrep (Pavel Antokolsky)
Buffgrep is a grep-like utility that operates on text blocks, rather than on single lines as in the ...
Modified: 2003/12/05 13:04

Match an IP address (Ken Simpson)
This regex matches IP addresses in the dotted quad form. It comes courtesy of Jeffrey Friedl's ...
Rated: 3 out of 5 by 4 user(s), Modified: 2003/10/23 17:13

use (patrick delage)
Rated: 1 out of 5 by 3 user(s), Modified: 2003/05/26 06:12

Capture HTML form data into a usable hash... (CGI) (Greg Patnude)
I developed this technique as an alternative to having to specifically cast name-value pairs into ...
Rated: 2 out of 5 by 1 user(s), Modified: 2002/12/06 17:31

test (test test)
test
Rated: 2 out of 5 by 9 user(s), Modified: 2002/09/24 14:30

CDRW Detection under Linux (Mark Parker)
A simple yet effective way to parse the output of cdrecord -scanbus and cdrecord -checkdrive to ...
Modified: 2002/09/04 00:19

(Ilya Livshits)
Modified: 2002/03/14 01:14

\d (Jochen Schnuerle)
Rated: 1 out of 5 by 10 user(s), Modified: 2002/01/24 12:55

Checking valid e-mail address in the easy way (Not specified Not specified)
This code Perl snipet is intended to check valid e-mail address, code is easy to understand because ...
Modified: 2001/09/23 22:23

Remove any HTML (Robert Dettmann)
This RegExp removes any pure HTML and decoded HTML to filter out content only.
Rated: 3 out of 5 by 7 user(s), Modified: 2001/08/02 13:35

Approved

Validating email addresses with Mail::CheckUser (Ken Simpson)
The only way to really know whether an email address is valid is to try sending mail to it. i.e., ...
Rated: 4 out of 5 by 2 user(s), Modified: 2001/06/20 10:57

Approved

Matching Royal Mail Postal Codes (Ken Simpson)
This regular expression matches valid postal codes as defined by the Royal Mail (the UK's postal ...
Rated: 4 out of 5 by 1 user(s), Modified: 2001/06/20 10:37

Approved

Removing dangerous characters from CGI forms (Ken Simpson)
When you write a CGI script, you should be conscious of the content of any user-supplied data your ...
Rated: 4 out of 5 by 2 user(s), Modified: 2001/06/11 16:24

How to make life easier with URL text highlighting. (Serge Kuznetsov)
I've used it for Web-board script, to colorify e-mail URLs, make HTTP/FTP URLs from a text, and ...
Modified: 2001/06/11 11:45

e-mail address validator (Yury Sukhovey)
This regex checks e-mail addres validation. Can check almost all typical errors (double @ char and ...
Rated: 2 out of 5 by 3 user(s), Modified: 2001/06/05 06:19

 

"show files" vulnerability with perl null bite bug. (Jong-Pork Park)
If your CGI aceepts some args from web and it is directly using args. Hacker can see files and ...
Rated: 2 out of 5 by 3 user(s), Modified: 2001/05/30 17:11

Approved

Extract the Korean language (Hangul) codes (Jong-Pork Park)
This regular expression extracts hangul (Korean Language) codes from web pages.
Rated: 4 out of 5 by 2 user(s), Modified: 2001/05/30 06:44

Approved

Validate Domain Names (John Graham)
Here's the one-line regex that will validate a domain label. It enforces the strict rules that a ...
Rated: 4 out of 5 by 4 user(s), Modified: 2001/05/30 05:01

Editors pick

Finding URLs in text -- the COMPLETE way (Ken Simpson)
This substitution expression, posted by Abigail to comp.lang.perl.misc on 08/14/2000, matches URLs ...
Rated: 4 out of 5 by 5 user(s), Modified: 2001/05/28 10:30

Approved

Breaking down a URI into its component parts (Ken Simpson)
Appendix B of IETF RFC 2396 provides this regular expression, which breaks down a Uniform Resource ...
Rated: 4 out of 5 by 4 user(s), Modified: 2001/05/28 09:53

Approved

Convert fractions to decimal (Neil Kandalgaonkar)
Searches through a text for almost any number, even fractions constructed using the ASCII slash. ...
Rated: 3 out of 5 by 2 user(s), Modified: 2001/05/24 16:09

Approved

Extracting HTML URL Links (Ken Simpson)
This regular expression is not very accurate, but it's fast and adequate for many situations.
Rated: 4 out of 5 by 2 user(s), Modified: 2001/05/24 15:22

Approved

Removing HTML from a file (Ken Simpson)
When writing CGI scripts which suck in textual content from users (such as discussion threads, for ...
Rated: 3 out of 5 by 7 user(s), Modified: 2001/05/24 15:13

Approved

Month Names (Ken Simpson)
This algorithm matches the English names of the twelve months of the Gregorian Calendar in full and ...
Modified: 2001/05/10 18:24

Approved

Profanity (asdfsa asdfdsaf)
Damian Conway's Regexp::Common module provides an excellent regular expression which matches words ...
Modified: 2001/05/10 18:24

Approved

Profanity (asdfsa asdfdsaf)
Damian Conway's Regexp::Common module provides an excellent regular expression which matches words ...
Modified: 2001/05/10 18:24

Approved

Removing C Comments in Source Code (asdfsa asdfdsaf)
It's often useful to search through large volumes of source code looking for particular text within ...
Rated: 3 out of 5 by 2 user(s), Modified: 2001/05/10 18:24

Approved

Removing C Comments in Source Code (asdfsa asdfdsaf)
It's often useful to search through large volumes of source code looking for particular text within ...
Rated: 3 out of 5 by 2 user(s), Modified: 2001/05/10 18:24

Approved

North American Telephone Numbers (Neil Watkiss)
This regular expression matches North American telephone numbers, such as 604-555-4301 or 555-1201.
Rated: 1 out of 5 by 1 user(s), Modified: 2001/05/10 18:24

Approved

Escaping non-printable characters (Neil Watkiss)
This regular expression matches non-printable characters, backslashes, and single quotes.
Modified: 2001/05/10 18:24

Approved

Parsing HTML using HTML::Parser (Gisle Aas)
HTML is best matched using a custom parsing module, such as HTML::Parser, as described in this ...
Rated: 2 out of 5 by 5 user(s), Modified: 2001/05/10 18:24

Approved

Matching HTML Entities (Gisle Aas)
HTML entities are special character sequences which let you encode otherwise illegal characters in ...
Modified: 2001/05/10 18:24

Approved

Extensible Markup Language (XML) (asdfsa asdfdsaf)
The Extensible Markup Language (XML) is a universal format for structured documents. XML is ...
Rated: 3 out of 5 by 1 user(s), Modified: 2001/05/10 18:24

Approved

Extensible Markup Language (XML) (asdfsa asdfdsaf)
The Extensible Markup Language (XML) is a universal format for structured documents. XML is ...
Rated: 3 out of 5 by 1 user(s), Modified: 2001/05/10 18:24

Approved

Removing Multiple Reply Tags in an Email Subject Line (asdfsa asdfdsaf)
Use this regular expression to get rid of or condense down multiple "Re:"s in email subject line. ...
Rated: 2 out of 5 by 2 user(s), Modified: 2001/05/10 18:24

REGEX - Kapitel aus dem PHP-Handbuch von Andrés Ehmann

http://www.infos24.de/phpe/handbuch/6_php_regular_expression.htm
 


regular expression mit PHP
Die Funktion preg_match
Die Funktion preg_match_all
Feststellen, ob eine Zeichenkette nur aus Zahlen besteht
Gierige und nicht nicht gierige Erweiterungen
Eine Wortgrenze festlegen
Eine Gruppe negieren
Unterscheidung zwischen Groß- und Kleinschreibung ausschalten
Mit regular expressions einen Array durchsuchen
Zeichenketten an einer Regular expression trennen
Bestimmte Werte durch eine regular expression ersetzen
Die Funktion preg_replace
Mehrere Teilstrings durch mehrere regular expressions ersetzen

regular expression mit PHP

Regular expressions sind die abstrakte Formulierung eines wie auch immer strukturierten Textes. Email Adressen haben eine Struktur, die Adresse einer Website hat eine Struktur, eine Telefonnummer hat eine Struktur, eine Postleitzahl hat eines Struktur. Alles was eine Struktur hat, lässt sich über regular expressions durchsuchen und verändern. Machen wir uns das an einem konkreten Beispiel klar.
Eine Adresse wie Andres_Ehmann@web.de hat eine Struktur. Zuerst kommt eine Reihe alphanummerischer Zeichen, ein Punkt oder ein Unterstrich, dann ein @ Zeichen, dann wieder eine Reihe alphanummerischer Zeichen Punkt oder Unterstrich, als letztes Element muss ein Punkt kommen dann eine Einheit von mindestens zwei und höchstens drei Buchstaben. Will man also zum Beispiel alle email Adressen in einer Website finden, dann muss man diese Struktur nachbilden. Machen wir und das nochmal klar. Wir haben folgende email-Adressen.

Andres_Ehmann@web.de
infos@infos24.de
ron_sommer@t-online.de
breitschwerdt@mercedes-benz.com

Alle diese Adressen haben folgende Struktur.

[beliebige Anzahl Buchstaben oder Zahlen oder . oder _ oder -]
[@ Zeichen]
[beliebige Anzahl Buchstaben oder Zahlen oder . oder _ oder -]
[.]
[mindestens zwei höchstens vier Buchstaben]

Das oben stehende ist die abstrakte Formulierung einer email-Adresse, wenn auch in Pseudo Code. Man könnte also durch Eingabe einer solch abstrakt formulierten Struktur alle email-Adressen finden. Man könnte aber noch mehr tun. Man könnte alles rausfischen, was nach dem Zeichen "@" kommt, also die Domains, web.de, mercedes-benz.com, t-online oder das was vor dem Zeichen "@" steht ändern in info etc. etc. Regular expressions haben für die Internet Programmierung eine enorme Bedeutung. In Zukunft werden aber auch wohl alle Bibliotheken mit Programmen ausgestattet sein, die mit regular expressions arbeiten. Das würde das finden von Büchern enorm vereinfacht (Zeige mir alle Bücher, wo die Wörter Gold, siglo de oro, Südamerika vorkommen, alle Bücher wo Helmut Kohl und Gorbatschev vorkommen etc. etc.) PHP hat alle regular expressions von Perl übernommen teilweise aber auch die Leistungsfähigkeit nochmal erweitert. Die Stärke der regular expressions liegt darin, dass mit Hilfe von regular expressions auch Textstrukturen erkannt werden können, die sehr schwach strukturiert sind. Zusätzlich bietet PHP sehr viel mehr fertige Funktionen zum Bearbeiten von Zeichenketten an, so daß in bestimmten Fällten auf regular expressions sogar verzichtet werden kann siehe Funktionen zum bearbeiten von Zeichenketten. Fangen wir mit dem einfachsten Fall an

Die Funktion preg_match

<?
$string="James Joyce und Virginia Wolf sind die größten englischsprachigen Schriftsteller";
$treffer=preg_match("/Virginia/", $string);
print $treffer;
?>

Das Ergebnis ist eins, weil Virginia in der Variable $string enthalten ist. Der Aufbau der Funktion preg_match ist etwas eigenartig. Der erste Parameter, Virginia, wird sowohl von Slashes (/) als auch von Anführungsstrichen umklammert. Die Anführungsstriche sind hierbei lediglich die Begrenzer des Parameters, die Slashes sind die Begrenzer der regular expression und können weitgehend willkürlich gewählt werden.

<?
$string="James Joyce und Virginia Wolf sind die größten englischsprachigen Schriftsteller";
$treffer=preg_match("!Virginia!", $string);
print $treffer;
?>

Wie deutlich zu sehen, kann auch das Ausrufungszeichen als Begrenzer gewählt werden, oder irgend etwas anderes. Man kann sich aber auch noch für etwas anderes interessieren, nämlich ob ein Wort vorhanden ist vom Typ [mit W starten] [dann zwei Buchstaben] [mit f enden]. In diesem Falle ist es klar, es ist Wolf. Da aber der Mittelteil abstrakt formuliert wurde, will man unter Umständen wissen, was es genau war, es könnte ja auch Wurf oder Werf sein. Man will also das konkrete Wort finden, das mit der abstrakt formulierten Struktur übereinstimmt. In diesem Fall muss man einen dritten Parameter angeben. Dies ist dann der Array, in der der Treffer abgespeichert wird.

<?
$string="James Joyce und Virginia Wolf sind die größten englischsprachigen Schriftsteller";
preg_match("!W..f!", $string,$gefundenes_wort);
print $gefundenes_wort[0];
?>

Wir sehen Wolf auf dem Bildschirm. Dazu gibt es nun ein bisschen was zu sagen. Die regular expression ist W..f. Die Punkte stehen hier für jedes x-beliebige Zeichen, folglich ist die Konstruktion z.B. mit Wolf kompatibel. Es gibt jetzt eine naheliegende Frage. Warum ist der dritte Parameter überhaupt ein Array ? Man hätte es ja genauso gut in eine Skalar Variable packen können. Tatsächlich ist dem nicht so, weil man hier eine Option hat. Man kann sich entweder alles zeigen lassen, was der regular expression entspricht, oder nur einen Ausschnitt aus derselben. Man betrachte folgendes kleines Programm.

<?
$string="James Joyce und Virginia Wolf sind die größten englischsprachigen Schriftsteller";
preg_match("!W(..)f!", $string,$gefundenes_wort);
print "Das ist der Teil, der innerhalb der Klammern steht ". $gefundenes_wort[1]."<br>";
print "Das ist die gesamte regular expression ". $gefundenes_wort[0]."<br>";
?>

Das produziert dann dieses Ergebnis:

Das ist der Teil, der innerhalb der Klammern steht ol
Das ist die gesamte regular expression Wolf

Wir sehen also, dass das zweite Element des Arrays ($gefundenes_wort[1]) nur den Teil erfasst, der innerhalb der runden Klammern steht, also ol für die zwei Punkte, während $gefundenes_wort[0] die gesamte regular expression erfasst. So weit so nett. Was ist aber, wenn die es mehrere Wörter mit der entsprechenden Struktur gibt und wir alle haben wollen. Die Funktion preg_match findet ja nur das erste Wort, dass der Struktur entspricht und bricht dann ab. Um alle Wörter zu finden, brauchen wir die Funktion preg_match_all.

Die Funktion preg_match_all

<?
$string="Maier Mayer Meier Meyer";
preg_match_all("/M(...)r/",$string,$gefundene_woerter);
print "Gesamter Ausdruck, zweiter Treffer ".$gefundene_woerter[0][1]."<br>";
print "Teilausdruck, zweiter Treffer ".$gefundene_woerter[1][1]."<br>";
?>

Das produziert dann dieses Ergebnis:

Gesamter Ausdruck, zweiter Treffer Mayer
Teilausdruck, zweiter Treffer aye

Wir erhalten also zwei zweidimensionale Arrays, einen $gefundene_woerter[0], der die gesamte regular expression für alle gefundenen Wörter beinhaltet (Maier, Mayer, Meier,Meyer) und einen $gefundene_woerter[1], der jeweils den von der runden Klammer umfassten Teil findet (aie,aye,eie,eye). Wenn man will, kann man alle gefundenen Wert ausdrucken.

<?
$string="Maier Mayer Meier Meyer";
preg_match_all("/M(...)r/",$string,$gefundene_woerter);
foreach ($gefundene_woerter[0] as $gesamter_Ausdruck)
{
print "Gesamter Ausdruck: ". $gesamter_Ausdruck."<br>";
}
print "------------------------------------------------------------<br>";
foreach($gefundene_woerter[1] as $gesamter_Ausdruck)
{
print "Gesamter Ausdruck: ".$gesamter_Ausdruck."<br>";
}
?>

Das produziert dann dieses Ergebnis:

Gesamter Ausdruck: Maier
Gesamter Ausdruck: Mayer
Gesamter Ausdruck: Meier
Gesamter Ausdruck: Meyer
------------------------------------------------------------
Gesamter Ausdruck: aie
Gesamter Ausdruck: aye
Gesamter Ausdruck: eie
Gesamter Ausdruck: eye

Durch Angabe eines optionalen vierten Parameters kann man bestimmen, wie die Werte abgespeichert werden. Entweder als zwei zweidimenisonale Arrays, wie oben, oder in mehreren eindimenisonalen Arrays ($gesuchte_woerter[0], $gesuchte_woerter[1],$gesuchte_woerter[2] etc. die dann jeweils zwei Elemente $gesuchte_woerter[0][0]/$gesuchte_woerter[0][1] etc haben. Gibt man nichts an, wie oben, wird PREG_PATTERN_ORDER verwendet. Die Alternative dazu ist PREG_SET_ORDER. Verdeutlichen wir uns die Zusammenhänge nochmal anhand eines Beispiels.

<?
$string="Maier Mayer Meier Meyer";
$treffer=preg_match_all("/M(...)r/",$string,$gefundene_woerter,PREG_SET_ORDER);
for ($i=0;$i<$treffer;$i++)
{
print "Gesamter Ausdruck: ". $gefundene_woerter[$i][0].
" Umklammerter Ausdruck: ".$gefundene_woerter[$i][1]."<br>";
}
?>

Das produziert dann dieses Ergebnis:

Maier aie Mayer aye Meyer eye

Bis jetzt haben wir noch kein ernsthaftes Problem gelöst. Ein ernsthaftes Problem wäre zum Beispiel mit regular expression zu prüfen, ob eine email Adresse, die ein User z.B. über ein HTML Formular eingibt, von ihrer Struktur her korrekt ist. Ein Programm, das so etwas leistet, würde so ähnlich aussehen wie dieser kleine Programm.

<?
$email="Andres_Ehmann@web.de";
$email_flag=preg_match("!^\w[\w|\.|\-]+@\w[\w|\.|\-]+\.[a-zA-Z]{2,4}$!",$email);
print $email_flag;
?>

Nun haben wir eine regular expression in ihrer ganzen Pracht, Blüte und Komplexität. Der Skript setzt 1 auf den Bildschirm, weil die regular expression eine email Adresse tatsächlich konkret beschreibt. Wir erinnern uns an das oben Gesagte. Abstrakt formuliert sieht eine email Adresse so aus.

1) [beliebige Anzahl Buchstaben oder Zahlen oder . oder _ oder -]
2) [@ Zeichen]
3) [beliebige Anzahl Buchstaben oder Zahlen oder . oder _ oder -]
4) [.]
5) [mindestens zwei höchstens vier Buchstaben]

Gehen wir die einzelnen Blöcke durch. Dem 1) Block entspricht

^\w[\w|\.|\-]+@

mit dem Dach (^) teilen wir mit, dass das gesuchte Konstrukt am Anfang der Zeichenkette enthalten sein muss, man muss das weglassen, wenn man z.B. nach email Adressen innerhalb einer HTML Seite sucht. Als nächstes kommt ein Wordelement (\w). Das sind all die Elemente, die unter Unix oder dessen Derivaten Bestandteil eines Dateinamens sein dürfen, also abcdefghijklmnopqrstyxz wie auch ABCDEFGHIJKLMNOPQRSTXYZ wie auch 1234567890 wie auch der Unterstrich _. Kein Wordelement sind äöüß oder Punkt und auch alle anderen Sonderzeichen nicht wie etwa é, spanische Tilde, ceguille etc. Wir gehen also davon aus, dass das erste Element ein Wordelement ist. Nach dem ersten Zeichen kann auch ein Punkt (.) oder Bindestrich erscheinen. A.Ehmann@web.de ist eine gültige emailadresse, genauso wie A-Ehmann@web.de. Folglich müssen wir für das dann folgende Zeichen eine Gruppe bilden. Wir tun das mit der eckigen Klammer [ ]. Mit der eckigen Klammer bilden wir Gruppen. Wir sagen in diesem Fall, dass die folgenden Zeichen entweder ein wordelement \w, ein Punkt \. oder ein Bindestrich \- sein muss. Die Pipe | ist hier das oder Zeichen. Der Punkt muss mit einem Backslash gekennzeichnet werden, weil er ja sonst, siehe oben, für jedes x-beliebige Zeichen stünde. Nach dem Klammerausdruck [\w|\.|\-] haben wir ein + Zeichen. Das heisst, dass die Elemente innerhalb des Klammerausdrucks einmal oder x-beliebig oft vorkommen können. Danach soll ein @ Zeichen kommen. Nach dem @ Zeichen soll, das ist Block 2). Nach dem @ Zeichen, Block 3), kommt wieder die gleiche Gruppe, die oben schon beschrieben wurde [\w|\.|\-]. Anschliessend, Block 4) soll ein Punkt kommen. Danach ein Buchstaben. Ach hier bilden wir wieder eine Gruppe, wählen aber eine Kurzschreibweise. Anstatt abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ schreiben wir [a-zA-Z]. Machen wir uns klar, wie oft ein Element dieses Typs, also ein Buchstabe vorkommen kann. Es handelt sich um die top level domain. Eine solche besteht mindestens aus zwei Buchstaben, de, fr, es, uk kann aber auch drei Buchstaben haben org, net, com, höchstens hat sie aber vier, wie etwa info. Mit der geschweiften Klammer geben wir diese Grenzen an {2,4}. Das heisst, das Element, dass unmittelbar vor der geschweiften Klammer steht muss mindestens 2 und darf höchstens 4 mal auftauchen. Ganz am Schluss setzen wir noch ein Dollarzeichen $. Damit teilen wir mit, dass danach nichts mehr folgen darf. Wir verhindern also, dass eine Adresse der Art Andres_Ehmann@web.aleman als gültig erkannt wird. Ich nehme an, dass an Hand dieses "real world" Beispiels jedem klar geworden ist, wie man mit regular expressions arbeitet. Ich gehe davon aus, dass sich der gesamte Umfang der regular expressions am schnellsten durch Beispiele erschliesst. Beispiel eins:

Feststellen, ob eine Zeichenkette nur aus Zahlen besteht

Anwendungsfall: Man will feststellen, ob eine Zeichenkette tatsächlich aus fünf Zahlen (also einer PLZ) besteht.

<?
$string="13189";
$treffer=preg_match("/^\d{5}$/",$string);
print $treffer;
?>

Die regular expression stimmt mit der Variable $string überein, folglich wird 1 zurückgeben. Mit \d sind alle Zahlen gemeint. Das ist äquivalent zu [0-9]
Beispiel zwei:

Gierige und nicht nicht gierige Erweiterungen

<?
$string="hallo du Mayer, Meyer, Meier";
preg_match("/.*(M..er)/",$string,$wort_in_runden_Klammern);
print $wort_in_runden_Klammern[1];
?>

Wir erinnern uns: Man kann in dem optionalen dritten Parameter den gefundenen Ausdruck speichern. Dabei ist das erste Element des Arrays $wort_in_runden_Klammern der Wert, der der gesamten regular Expression entspricht, das zweite Element der Wert, der dem in runden Klammern stehenden Teil der regular Expression entspricht. Die Frage ist nun, steht da Mayer, Müller oder Meier ? Verblüffender Weise ist das Ergebnis Meier und nicht wie viele erwarten Mayer. Das liegt daran, dass sowohl das Pluszeichen + (das vor dem + Zeichen stehende Zeichen muss mindestens einmal oder beliebig oft auftauchen), wie auch das Sternchen * ( das vor dem * Zeichen stehende Zeichen kann null Mal oder beliebig oft auftauchen) greedy sind, also gierig. Sie greifen durch, bis die Gruppe (in unserem Falle (M..er)) zum ersten Mal auftaucht, sondern bis dahin, wo sie zum letzten Mal auftaucht, also bis Meier. Mayer und Müller werden also übersprungen. Für viele Anwendungen aus der Praxis will man das so. Bei anderen aber nicht. Wie also gewöhnt man dem + und dem * ab greedy zu sein. Wie bringt man sie dazu, beim ersten Auftreten des Ausdrucks der Ihnen unmittelbar folgt zu stoppen. Das geht recht einfach und sieht so aus:

<?
$string="hallo du Mayer, Meyer, Meier";
preg_match("/.*?(M..er)/",$string,$wort_in_runden_Klammern);
print $wort_in_runden_Klammern[1];
?>

Es wurde lediglich das Fragezeichen hinzugefügt, mit der Wirkung, dass der * (bzw. das + Zeichen) nach Auftreten des erstmaligen Auftretens des Ausdrucks der danach steht stoppt. Wir erhalten das, was viele wohl schon oben erwartet haben: Mayer.

Eine Wortgrenze festlegen

Der oben beschriebene Fall, der Ausdruck, der eine email Adresse beschreibt, war ja ganz nett. Aber was machen wir, wenn wir alle, also unter Umständen mehrere email Adressen aus einer HTML Seite fischen wollen. Wir können dann als Begrenzer des Ausdrucks nicht mehr das $ Zeichen verwenden, weil die Zeichenkette ja danach weitergeht. Eine Lösung sieht so aus:

<?
$string=" In einer HTML Seite können sich mehrere email Adressen befinden
wie z.B. Andres_Ehmann@web.de. Es kann sogar
komplizierter sein, die email Adresse kann clickable sein also
<A href=mailto:infos@infos24.de>infos@infos24.de</A>. Man weiss
auch nicht wieviele drin sind, z.B. bei Firmen kann ja eine da stehen,
wie etwa duisenberg@ezb.de oder eine ganze Latte,
willibald@ezb.com und kunigunde@ezb.de. Wir sehen also, es ist schwierig.";

$anzahl_der_Treffer=preg_match_all("!\b\w[\w|\.|\-]+@\w[\w|\.|\-]+\.[a-zA-Z]{2,4}\b!",
$string,$speicher_mails);
for($i=0;$i<$anzahl_der_Treffer;$i++)
{
print $speicher_mails[0][$i]."<br>";
}
?>

Das produziert dann dieses Ergebnis:

Andres_Ehmann@web.de
infos@infos24.de
infos@infos24.de
duisenberg@ezb.de
willibald@ezb.com
kunigunde@ezb.de

Es wurde also lediglich da Dach ^ und das Dollar Zeichen durch eine word boundary \b ersetzt. Nun stellt sich die Frage, welches Zeichen durch die word boundary \b eigentlich dargestellt wird. Die Antwort ist: Gar keines. Eine word boundary ist immer dann gegeben, wenn das Zeichen links davon ein word element ist also zur Gruppe \w gehörig und rechts davon ein non word charakter Zeichen steht. Es muss also nicht unbedingt ein Leerzeichen das sein. Dies kann man der Tatsache entnehmen, dass die email Adresse in infos@infos24.de gefunden wird. Das Zeichen \b ist selber aber kein Zeichen und die regular expression wandert durch eine word boundary auch nicht weiter.

Eine Gruppe negieren

Das Dach ^ haben wir schon kennengelernt. Normalerweise signalisieren wir damit, dass die regular expression der Zeichenkette, auf die sie angewendet wird, von Anfang an entsprechen muss. Das Dach hat aber innerhalb der Definition einer Gruppe eine völlig andere Bedeutung. Innerhalb einer Gruppe wird der Inhalt der Gruppe durch das Dach negiert.

<?
$string="Andres E§hmann";
$treffer=preg_match("/[^A-Za-zöüä\s]/",$string);
print $treffer;
?>

Mit einer regular expression, wie sie oben beschrieben ist, könnte man zumindest eine sehr grobe Art und Weise prüfen, ob der Namen plausibel ist. Namen, zumindest von natürlichen Personen, können nur Buchstaben und Leerzeichen enthalten. Die Besonderheiten der jeweiligen Sprache müsste man dann noch extra angeben. Die oben abgebildete regular expression würde nun aber nicht prüfen, ob einer der in der Klammern stehenden Zeichen in dem Ausdruck enthalten ist. Das Dach bewirkt, dass jedes Zeichen ein Treffer ist, das nicht enthalten ist. Da der Name ein Zeichen enthält, dass nicht enthalten ist, nämlich das § Zeichen, hat die Variable $treffer den Wert 1. Prüfen, ob ein lange Zeichenkette vorkommt, die keine Leerzeichen enthält
Ein typisches Problem der Internetprogrammierung ist die Notwendigkeit, lange Zeichenketten ohne Leerzeichen abzufangen. Dieses Problem stellt sich bei Gästebüchern, Chats, Foren, Anzeigenmärkten etc. Der User kann in ein HTML Formularfeld eine sehr lange Zeichenkette, z.B. 1000 Zeichen ohne Leerzeichen. Der Browser hat dann keine Chance, umzubrechen. Dies wiederum bewirkt, dass die komplette Zeichenkette in einer Zeile dargestellt wird, was dann wiederum den Broser veranlasst, nach rechts wegzuscrollen und das gesamte Layout der Seite zu zerschiessen. Mit dem in dem Skript unten enthaltenem Algorithmus liese sich dieses Problem lösen.


<?
$string="dasisteineZeichenketteohneeinLeerzeichendaswürdezu
problemenführendaderBrowserdieseineinerZeile
darstellenmüsstewodurchdasLayoutzerschossenwird";
$treffer=preg_match("/[^\s]{45}/",$string);
print $treffer;
?>

Das heisst, wir suchen eine 45 Zeichen lange Zeichenkette, in der jedes Zeichen ausser dem Leerzeichen \s vorkommen darf. Ist $treffer also 1, was hier der Fall ist, dann ist die Zeichenkette ungültig, da zu lang.

Unterscheidung zwischen Groß- und Kleinschreibung ausschalten

Wenn man nichts tut, wird zwischen Groß- und Kleinschreibung unterschieden, das heisst, unten stehendes Programm hat den Rückgabewert 0.

<?
$string="Andrés";
$treffer=preg_match("/a/",$string);
print $treffer;
?>

A ist nicht a und folglich ist die regular Expression in der Zeichenkette Andrés nicht vorganden. Das kann man mit i wie indifferent ändern.

<?
$string="Andrés";
$treffer=preg_match("/a/i",$string);
print $treffer;
?>

Das produziert dann dieses Ergebnis:

Jetzt erscheint 1 im Browser.

Mit regular expressions einen Array durchsuchen

Man kann mit regular expressions auch einen Array durchsuchen. Das Ergebnis ist dann wiederum ein Array, der die Arrayelemente enthält, die mit der regular expression übereinstimmen. Die Funktion entspricht der grep Funktion von Perl.

<?
$tutti=array("Banane","Himbeere","Ananas","Birne","Granatapfel","Pflaumen");
$treffer=preg_grep("/an/i",$tutti);
foreach($treffer as $gefunden)
{
print $gefunden. "<br>";
}
?>

Das produziert dann dieses Ergebnis:

Banane
Ananas
Granatapfel

Zeichenketten an einer Regular expression trennen

Man kann, insbesondere in der Bioinformatik, vor dem Problem stehen, dass man eine lange Zeichenkette in einzelne Bereiche auftrennen will, die Schnittstelle aber, an der gespalten werden soll, nicht bekannt ist. In diesem Fall kann man auch an einer regular expression spalten. Die Funktion entpricht der grep Funktion in Perl.

<?
$string="Andres Ehmann 11111 David Romero 22222 Jaime
Jimenez 33333 Maria Gonzales 44444 Consuelo Landivar";
$einzelteile=preg_split("/\d{5}/",$string);
foreach ($einzelteile as $einzeln)
{
print $einzeln."<br>";
}
?>

Das produziert dann dieses Ergebnis:

Andres Ehmann
David Romero
Jaime Jimenez
Maria Gonzales
Consuelo Landivar

Bestimmte Werte durch eine regular expression ersetzen

Will man dem User erlauben, Bilder in z.B. Gästebücher einzufügen, dann ist er meistens nur in der Lage, etwas wie http://www.eine_domain.de/bild.jpg einzugeben. Damit es tatsächlich erscheint, müsste das Bild eingebunden werden in einen HTML Tag, also . Man muss also eine Möglichkeit finden, ein Bild in einen HTML Tag einzubinden.

<?
$string="Bilder, wie etwa www.eine_domain.de/bilder/bild.gif,
machen alles richtig schön bunt. Geht auch mit http://www.domain.de/kirsche.jpg";
$ersetzt=preg_replace("!(http://|\s)([\w|-|_|/|\.]+/[\w|-|_]+\.
((jpg)|(gif)|(png)))!","<img src=http://$2>",$string);
print $ersetzt;
?>

Der HTML Quellcode,der produziert wird, sieht dann so aus:
Bilder, wie etwa<img src=http://www.eine_domain.de/bilder/bild.gif>, machen alles richtig schön bunt.
Geht auch mit <img src=http://www.domain.de/kirsche.jpg>

Wie deutlich zu sehen, wurde, der Pfad zu dem Bild in den entsprechenden HTML Tag eingebunden.
Auch dies ist mal wieder so eine regular expression, bei der es einem glatt die Schuhsohlen hochzieht. Machen wir uns das klar. Die regular expression lässt sich aufspalten in mehrere Bereiche.

(1) (http://|\s)
Vor der eigentlichen Adresse, müsste eigentlich http:// stehen. Wir wissen aber nicht,
ob der User genug Erfahrung mit dem Internet hat. Unter Umständen vergisst er dass,
so dass vor dem eigentlichen Link auch lediglich ein Leerzeichen stehen kann.
Wichtig an dieser Stelle, die runde Klammer. Die eckige Klammer hätte die Wirkung, dass jedes Zeichen zum anderen in einer oder Beziehung steht. Also h oder t oder p oder : oder /. Das ist nicht das, was wir wollen. Der Ausdruck als ganzes soll auftauchen, http:// oder das Leerzeichen \s. Die runde Klammer hat aber auch noch eine zweite Wirkung. Der Teil der Zeichenkette, der dem Teil des von der runden Klammer umfassten Teils der regular expression entspricht, wird in der Sondervariablen $1 bzw. $2, wenn es noch einen geklammerten Ausdruck gibt, bzw. $3 etc. abgespeichert. Man beachte, dass wir als zu ersetzenden Wert mit der Variablen $2 arbeiten.

(2) (reg ex)
Man beachte, dass alles was dann folgt, in runden Klammern steht, so dass wir es nachher mit $2 wieder abgreifen können.

(3) [\w|-|_|/|\.]+/
Wir greifen durch bis zum letzten /. Vorkommen dürfen alle word elements, siehe oben, der Bindestrich, der _ oder ein Punkt.

(4) [\w|-|_]+
Nach dem letzten slash, zu dem wir in (3) marschiert sind, kommt der Name des Bildes (im Beispiel bild). Er kann aus einem word element, einem Bindestrich oder einem Unterstrich bestehen. Dieser Ausdruck marschiert bis zu dem Punkt vor der Dateiendung (png, gif, jpg).

(5) ((jpg)|(gif)|(png))
Am Schluss muss entweder jpg, gif oder png stehen. Man beachte, dass der ganze Ausdruck nochmal von einer Klammer umfasst wird. Nur so erkennt die regular expression, dass entweder jpg oder gif oder png gefunden werden soll.

Die Funktion preg_replace

Die Funktion preg_replace hat folgende Syntax:
preg_replace("regular expression, die zeigt, was ersetzt werden soll","das, durch was ersetzt wird","die Zeichenkette, auf die sie angewendet wird); Interessantes und neues gibt es jetzt nur über den zweiten Parameter der Funktion zu berichten. In der regular expression haben wir die Adresse des Bildes in runde Klammern gesetzt. Folglich steht uns dieser Wert nun in der Sondervariablen $1 zur Verfügung. Wir verwenden diesen Wert, um den HTML Tag zusammenzubauen. Thats it.

Mehrere Teilstrings durch mehrere regular expressions ersetzen

Die Funktion preg_replace hat gegenüber der substitution Funktion von Perl den Vorteil, dass sie auch Arrays als Parameter akzeptiert. Dies ermöglicht es, auf eine Zeichenkette mehrere regular expression anzuwenden.

<?
$adresse=array("/Familienname/","/Telefon/","/Beruf/");
$ersatz=array("name","phone","profession");
$string="Familienname:Andres Ehmann, Telefon:030-47301386,
Beruf: Diplom Volkswirt/Magister Artium";
$fertisch=preg_replace($adresse,$ersatz,$string);
print $fertisch;
?>

Das produziert dann dieses Ergebnis:

name:Andres Ehmann, phone:030-47301386,profession: Diplom Volkswirt/Magister Artium

vorhergehendes Kapitel


Linktipps

Einkaufen

Internet-Einkaufszentrum

Computer, Elektronik

Freizeit, Sport, Fitness

Mobilfunk, Handy

Apple iPhone

Mobilfunk Handytarife

Fotografie

Filmen

Rund um's Auto

Mehr? Sieh selbst:

Verbraucherschutz

Verbrauchermagazin

Nachrichten

Stiftung Warentest

Ökotest

Verbraucherschutz-Ministerium

Wer ist unter uns?



Bücher




Software


Nutzen Sie die Vorteile beim Softwarekauf Über Amazon: Software wird von Kunden bewertet - günstiges Versandkostensystem - Amazon ist zuverlässig





Handy/Telefon


O2 Inklusiv Pakete Online

Empfehlung: Top-Services

Kredite und Finanzierung

Tagesgeld und Girokonten

Partnersuche

Reisen

Hotelsuche

Handytarif-Vergleich

Stromtarif-Vergleich

Gastarif-Vergleich

Internet Flatrate Vergleich

Versicherungsvergleich

Immobilien

Verbraucherschutz



TERRE DES LANGUES e.V. - 25 Jahre Erfahrung in Sprachreisen, Schuljahresaufenthalte, Highschool-Years und Gastfamilienaufenthalte


www.user-archiv.de (seit 1999)