Regular Expressions in PHP

  • #1
M

Michael_B

Bekanntes Mitglied
Themenersteller
Dabei seit
21.09.2002
Beiträge
860
Reaktionspunkte
0
Ort
Köln
Hallöchen Gemeinde,

ich muss ein PHP Skript schreiben, in dem aus einer DB Telefonnummern (weltweit) und URLs ausgelesen und auf syntaktische Korrektheit überprüft werden sollen. Am einfachsten geht das natürlich mit Regular Expressions. Allerdings komm ich nicht auf die entsprechenden Regeln. Kann mir da jemand helfen?

Ich suche für die Telefonnummern eine Regel, die folgendes beachtet:
1. Nummern müssen mit einem + beginnen (+49-...),
2. alles was hinter dem + steht kann nur numerische Werte haben,
3. Ausnahme: Trennzeichen, wie -, / oder (blank) sind erlaubt,
4. hinter dem + darf kein Trennzeichen stehen, es muss eine Nummer/Zahl sein.
Mögliche Nummern wären hier also:
+123-456-7890123-45
+123 456 7890123 45
+123/456/7890123/45
oder auch mixed: +123-456/7890123 45

Die Regeln der URLs sind ja klar:
1. Beginnt immer mit http:// (sind auch immer HTTP-URLs),
2. Aufbau der URL,
3. hinter der Top Level Domain (z. B. .com) kommt kein expliziter Dateiaufruf, die URL endet also mit der TLD oder auch mit der TLD gefolgt von einem /. Aber dahinter darf nix mehr kommen.

Wäre kewl, wenn mir da jemand die entsprechenden Parameter für den preg_match()-Befehl geben könnte.

Dankeschön.
 
  • #2
Hi,

Für die Nummern:
if (preg_match(/^\+[0-9]{1}[0-9\s\-\/]*$/i,$nummer)) echo ok;

Für den URL:
if (preg_match(/^(http:\/\/)?[0-9a-z\-]*\.[0-9a-z\-]*\.[0-9a-z\-]*[\/]?$/i,$URL)) echo ok;
 
  • #3
Hi

Stimmt nicht ganz. Hoffe die funktionieren so.
@Jana, die Delimiter dürfen in der Expression selber nicht mehr vorkommen.

Für die Nummern:
if (preg_match(!^\+[0-9]{2,3}([0-9]+[\s\-\/]?)+$!i,$nummer)) echo ok;

Für den URL:
if (preg_match(!^http:\/\/([0-9a-z][0-9a-z-]*[0-9a-z]\.)+[a-z]{2,6}\/?$/i,$URL)) echo ok;

Gruß, Michael
 
  • #4
Vielen Dank, ich werde morgen beide Versionen mal ausprobieren und mich dann wieder melden.
 
  • #5
die Delimiter dürfen in der Expression selber nicht mehr vorkommen.
Hm? Bei mir funktioniert es so. Was genau soll daran falsch sein?
 
  • #6
Hi

Durch das Escapen darf man sie wohl doch verwenden, hatte das anders in Erinnerung.
meine /^http:\/\/(..)$/i

Gruß, Michael
 
  • #7
Also... habe im endeffekt folgende Funktion genommen.
preg_match(/^(http:\/\/)?([0-9a-z][0-9a-z-]*[0-9a-z]\.)+[a-z]{2,6}\/?$/i,$homepage.
Demnach ist es egal, ob die URL ein http:// am Anfang hat oder nicht. Habe allerdings jetzt bemerkt, dass es doch URLs in unserer Datenbank gibt, die nach der TLD noch etwas anderes stehen haben. Das was da noch steht, sind aber keine Dateien, sondern lediglich Verzeichnisse. Die o. a. Funktion liefert erkennt keine URLs, die z. B. folgende Struktur haben: www.irgendwas.nochwas.tld/verzeichnis oder
www.irgendwas.nochwas.tld/verzeichnis/
Habe versucht, das selbst hinzubiegen, dass preg_match das erkennt, aber irgendwie scheine ich zu doof dafür zu sein...

Könnte ich da nochmal etwas von eurem geistigen Intellekt schnorren?
Danke.

PS: Soweit ich mich erinnern kann, war die Funktion von PCDReitz nicht ganz in ordnung, da dort keine URLs gefunden wurden, die eine Subdomain haben (z. B. www.irgendwas.nochwas.tld). Sondern nur Standard-URLs vom Format www.irgendwas.tld
 
  • #8
Noch etwas:
für Telefonnummern hab ich mich für diese Funktion entschieden:
preg_match(!^\+[1-9]{1,4}([0-9]+[\s\-\/]?)+$!i,$phone
Allerdings haben wir in der DB auch einige Nummern, die nicht da reinpassen. Fragt mich aber nicht, warum. Ich kann keine besonderen Unterschiede (zu Nummern, die passen) feststellen. Solche Nummern sind z. B. +1-530-888-8871 oder +7-95-956-9954

Kann mir jemand sagen, warum die nicht in das Pattern passen?

Nochmals danke
 
  • #9
Hi

Sorry, da hatte ich was falsch:
preg_match(!^\+[1-9]{1,4}([\s\-\/]?[0-9]+)+$!i,$phone);
So sollte es gehen.

Wegen den URLs.
preg_match(/^(http:\/\/)?([0-9a-z][0-9a-z-]*[0-9a-z]\.)+[a-z]{2,6}\/?.*$/i,$homepage);
würde dann gehen, aber alles nehmen was hintendran steht, also auch Verweise auf Dateien, aber woher soll man auch wissen ob es eine Datei oder ein Verzeichnis ist.

Gruß, Michael
 
  • #10
Jo danke, funzt alles wie erwartet.
 
  • #11
Hallo liebe Community,

gestern Abend kam bei mir zum ersten mal die Fehlermeldung von Windows das meine Festplatte, auf der auch Windows Installiert ist, beschädigt ist und ich dringend alle Daten sichern sollte und einen neuen Datenträger einlegen sollte.
Habe inziwschen alles gesichert war auch noch kein Problem und habe mich ein wenig im Internet schlau gemacht und dabei kam herraus das sich Windows auch mal Irren kann, was ich nicht schlimm finde, aber lieber nochmal durch ein Programm überprüfen will. Habe mir nun SeaTools geholt für meine Seagate Platte, aber es läuft nicht. Es kommt das Anfangsfenster: "SCSI: Untersütze Festplatten werden gesucht. Bitte warten..."
Danach tut sich einfach nichts mehr.
Könnt ihr mir vllt andere Programme empfehlen? Oder sagen, wie ich das vllt auch unter Windows genauer überprüfen kann mit der Festplatte, wenn überhautpt möglich?

Danke schonmal im Vorraus.
 
  • #12
  • #13
Danke für deine Antwort Rossy,

habs auch direkt gemacht und es ist zwar keine Ausrufezeichen da, aber trotzdem scheinbar eine Fehlermeldung:

ID: 15
Eigenschaften-Beschreibung: ReallocatedSector Count
Grenzwert: 36
Wert: 33
Schlechtester Wert: 33
Daten: 22144
Status: Vorfehler: Bevorstehender Datenverlust wird angekündigt!

Ach und vor ID 15 ist noch ein rotes Kreuz wo sonst ein blauer hacken sein sollte.

Wie sollte ich am besten vorgehen?
Ist es "ernst"?

Edit: Hier nochmal ein Screen: http://s14.directupload.net/file/d/2858/jtjku23g_jpg.htm
 
  • #14
Jup würde sofort sichern und mir eine neue Festplatte zulegen. Ich würde auf dieser Platte nichts mehr speichern.


Gruß Rossy
 
  • #15
Jup würde sofort sichern und mir eine neue Festplatte zulegen. Ich würde auf dieser Platte nichts mehr speichern.


Gruß Rossy
 
  • #16
Okay danke für deine Hilfe,
ich versuchs mal per Garantie die Platte ist grade mal 5 Monate alt...
 
Thema:

Regular Expressions in PHP

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.961
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben