Strings - Mustererkennung
Wie finde ich eine URL in einem Textabschnitt?
(
Autor: Ishka & perl-community)
Ich habe einen String, und möchte ein komplexes Muster herausfinden
(z.B. ob eine URL auf eine Seite aus Deutschland in dem String vorkommt):
$string1='hddp://das.ist.keine.ulr/aus/Deutschland';
$string2='http://www.aus-deutschland.de';
if ($string1=~/http:\/\/[a-zA-Z_\-\.]+\.de/)
{
print 'string 1 ist URL aus Deutschland'
}#Wird nicht angezeigt
if ($string2=~/http:\/\/[a-zA-Z_\-\.]+\.de/)
{
print 'string 2 ist URL aus Deutschland'
}#Wird angezeigt
Erklärung:
Was macht also der kryptisch anmutende Ausdruck /http:\/\/[a-zA-Z_\-\.]+\.de/ ?
In der
Einführung in die Mustererkennung haben wir
kennengelernt, wie Mustererkennung grundsätzlich funktioniert. Allerdings können
zwischen // nicht nur Zeichen stehen, die erkannt werden, sondern auch Steuerzeichen.
/http:
\/\/[a-zA-Z_\-\.]+\.de/
Falls man ein solches Steuerzeichen trotzdem als Zeichen erkennen möchte, einfach
ein \ davor setzen und es wird als normales Zeichen erkannt (/ alleine hätte den Ausdruck
zu früh geschlossen).
/http:\/\/
[a-zA-Z0-9_\-\.]+\.de/
Die eckigen Klammern [ ] bedeuten: Eins der Zeichen im inneren. [abcde] hieße zum Beispiel:
Ein a, ein b, ein c, ein d oder ein e. Abkürzend kann man auch Schreiben: [a-e]. [aA0] würde
bedeuten: ein kleines a, ein großes A, oder 0. diese beiden Schreibweisen kann
man auch beliebig kombinieren: [a-pruA-C0-9] würde also heißen: ein Buchstabe zwischen
a und p, oder ein r oder ein u, oder ein A, B oder C oder irgendeine Zahl. Steuerzeichen müssen
auch hier mit \ gekennzeichnet werden, wenn sie als Zeichen erkannt werden sollen.
/http:\/\/[a-zA-Z_\-\.]
+\.de/ ?
das + als Steuerzeichen bedeutet: Ein oder mehrere Mal der letzte Buchstabe.
weitere Steuerzeichen (im Beispiel in m// eingebaut) sind:
m/./ # Ein einzelner Buchstabe. Erkennt weder \r noch \n (Zeilenumbrüche)
m/\./ # Durch das Zeichen \ wird der Steuerbefehl nicht ausgeführt, sondern das nachfolgende
Zeichen als Zeichen erkannt
m/^/ # Zeilen- oder Stringanfang
m/$/ # Zeilen- oder Stringende
m/*/ # Null oder mehrere Male den letzten Buchstaben
m/+/ # Ein oder mehrere Male den letzten Buchstaben
m/?/ # Null oder ein Mal den letzten Buchstaben
m/{5,7}/ # Fünf bis sieben mal den letzten Buchstaben
Ergänzungen, Kommentare
TinaMueller - 12 Aug 2003 - URI::Find
Man kann auch das Modul URI::Find benutzen:
require URI::Find;
my $finder = URI::Find->new(\&callback);
my $anzahl = $finder->find(\$text);
sub callback { mach_was_mit($_[1]) }
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne <verbatim>):
---### Main.??? - 14 Jul 2003 - Betreff