Regulärer Ausdruck für Telefonnummer
Matthias Schlüter
- php
Hallo!
Hat jemand von euch einen regulären Ausdruck zum Prüfen auf eine Telefonnummer parat? Ich nutze die eregi()-Funktion von php5
Ich habe schon so einiges abgesucht und konnte leider nichts brauchbares finden.
Gruß
Matthias
Achso, aktuell nutze ich das:
^([+][ ]?[1-9][0-9][ ]?[-]?[ ]?|[(]?[0][ ]?)[0-9]{3,4}[-)/ ]?[ ]?[1-9][-0-9 ]{3,16}$
Hello out there!
Hat jemand von euch einen regulären Ausdruck zum Prüfen auf eine Telefonnummer parat?
http://forum.de.selfhtml.org/archiv/2007/2/t146255/
Ich habe schon so einiges abgesucht und konnte leider nichts brauchbares finden.
"Schon einiges" schließt bei dir die SELFHTML-Suche aus?? Die Suche nach '+telefon +regulär +Ausdruck' hätte dir auch diesen Thread ausgespuckt.
See ya up the road,
Gunnar
Hi!
"Schon einiges" schließt bei dir die [...] aus?? Die nach '+telefon hätte dir auch diesen Thread ausgespuckt.
natürlich nicht, ich hatte nach eregi und telefonnummer gesucht und bin daher nicht fündig geworden. =)
Danke
Hello out there!
Wenn ich nicht etwas übersehen habe wird dort:
[1]{3,15}$ (bzw. [2]{1,15}$) als Ausdruck diskutiert
Du hast auch nicht übersehen, dass dort auch die Einbeziehung von 'A'-'Z' diskutiert wird?
gültige Werte wären dann:
()1
++1
+++
usw.
Was genau soll der Ausdruck prüfen? Ob die Ziffenfolge nach '+' eine gültige Landeskennzahl ist? Ob die Ziffenfolge nach der Landeskennzahl bzw. nach führender '0' eine für das jeweilige Land gültige Ortsnetzkennzahl ist?
Irgendiwe erscheint mir eine Prüfung einer Telefonnummer fraglich.
See ya up the road,
Gunnar
Hallo!
Was genau soll der Ausdruck prüfen? Ob die Ziffenfolge nach '+' eine gültige Landeskennzahl ist? Ob die Ziffenfolge nach der Landeskennzahl bzw. nach führender '0' eine für das jeweilige Land gültige Ortsnetzkennzahl ist?
Der Ausdruck soll prüfen, ob eine eingegeben Zeichenkette syntaktisch der einer Telefonnummer entspricht, ob nun mit, oder ohne Landeskennzahl, mit oder ohne Klammern oder Trennzeichen. Wenn solche Zeichen gesetzt werden, sollen sie aber schon an der richtigen Stelle vorkommen.
Irgendiwe erscheint mir eine Prüfung einer Telefonnummer fraglich.
Warum?
Hello out there!
Der Ausdruck soll prüfen, ob eine eingegeben Zeichenkette syntaktisch der einer Telefonnummer entspricht, ob nun mit, oder ohne Landeskennzahl, mit oder ohne Klammern oder Trennzeichen. Wenn solche Zeichen gesetzt werden, sollen sie aber schon an der richtigen Stelle vorkommen.
Also zuerst möglicherweise ein '+' gefolgt von mindestens einer Ziffer:
(+[0-9]+)?
Es kann ein geklammerter Block auftreten; wenn '(' vorkommt, muss auch ')' vorkommen. Vor und nach den Klammern darf auch ' ' bzw. '-' stehen. In den Klammern mindestens eine Ziffer; ' ', keine '-' als Trennzeichen, diese nur zwischen Ziffern:
([ -]?([0-9]+( [0-9]+)*)[ -]?)?
Dann können Ziffern, Buchstaben¹ und als Trennzeichen² ' ', '-', '/' auftreten:
[0-9A-Za-z]+([ -/][0-9A-Za-z]+)*
Von Anfang ('^') bis Ende ('$') also:
^(+[0-9]+)?([ -]?([0-9]+( [0-9]+)*)[ -]?)?[0-9A-Za-z]+([ -/][0-9A-Za-z]+)*$
Irgendiwe erscheint mir eine Prüfung einer Telefonnummer fraglich.
Warum?
Weil man diese beliebig genau betreiben kann und doch nicht alles erfasst.
See ya up the road,
Gunnar
¹ Vanity-Nummern werden üblicherweise in Großbuchstaben notiert; wegen besserer Nutzbarkeit würde ich auch Kleinbuchstaben zulassen. Oder evtl. noch besser vor der Prüfung den String in Großbuchstaben umwandeln.
² In der Variante ist nur ein Trennzeichen hintereinander zugelassen. Sollen auch " / ", " - " gültig sein, wäre das dort anzupassen.
Hi!
Uii... vielen lieben Dank =)
Hello out there!
Uii... vielen lieben Dank =)
Nicht zu früh! ;-)
Der Ausdruck lässt auch "-(089) 32 16 8" durch; soll er aber nicht.
See ya up the road,
Gunnar
gudn tach!
Hat jemand von euch einen regulären Ausdruck zum Prüfen auf eine Telefonnummer parat?
mittlerweile hast du ja sowas.
vielleicht hilft ja auch eine festere vorgabe weiter:
din 5008, itu e.123
nach din 5008 wuerde z.b. max. ein bindestrich vorkommen.
spontan wuerde imho
/^(?:+\d+ |0)\d+ \d+(?:-\d+)?\z/
din-nummern matchen.
zuerst eine laendervorwahl gefolgt von einem space oder eine 0.
dann die vorwahl.
ein space.
die eigentliche nummer.
evtl. ein bindestrich und 'ne durchwahl.
Ich nutze die eregi()-Funktion von php5
evtl. ist preg_match() besser.
prost
seth
Hi,
Hat jemand von euch einen regulären Ausdruck zum Prüfen auf eine Telefonnummer parat? Ich nutze die eregi()-Funktion von php5
Ich habe schon so einiges abgesucht und konnte leider nichts brauchbares finden.
Woraus besteht eine Telefonnummer üblicherweise (nicht nach Norm, sondern so, wie Leute es aufschreiben)?
1. evtl. eine Ländervorwahl (angeführt von + oder 00, danach IIRC bis zu 4 Ziffern, deren erste keine 0 ist, üblicherweise ohne Leerzeichen dazwischen, gefolgt von einem optionalen Leerzeichen), also
(?:(?:+|00)[1-9][0-9]{0,3} ?)?
2. eine Ortsvorwahl (normalerweise mit führender Null, die aber auch entfallen kann, wenn Ländervorwahl vorhanden ist, ggf. in Klammern, dann aber ohne führende 0, üblicherweise ohne Leerzeichen dazwischen, die genaue Ziffernzahl ist mir nicht bekannt, ich nehm mal 6 als Maximum), also
(?:([1-9][0-9]{0,5})|0?[1-9][0-9]{0,5})
3. eine Rufnummer (1. Ziffer keine 0, afaik bis zu 8 Ziffern, oft mit Leerzeichen dazwischen gruppiert)
[1-9](?: ?[1-9]){3,7}
(die Forderung nach 1 + 3 Ziffern mindestens schließt 110, 112, 911 und ähnliche aus
4. eine Durchwahl (Bindestrich, bis zu 5 Ziffern, ggf. mit Leerzeichen dazwischen)
(?: ?-(?: ?[0-9]){1,5})?
Jetzt muß man das nur noch zusammenkleistern (zwischen Vorwahl und Rufnummer noch Leerzeichen oder / zulassen:
(?:(?:+|00)[1-9][0-9]{0,3} ?)?(?:([1-9][0-9]{0,5})|0?[1-9][0-9]{0,5})(?: (?:/ ))?[1-9](?: ?[1-9]){3,7}(?: ?-(?: ?[0-9]){1,5})?
Wenn es nur um deutsche Nummern geht (Landesvorwahl dann
(?:(?:+|00)49 ?)?
) , könnte man vor der Rufnummer noch einen negativen Lookahead auf 11 einbauen, damit Auskunftsdienste (hier werden Sie gehelft, Feuerwehr usw. ausgeschlossen werden und ggf. andere Sondernummern), also
(?!11|19222)
direkt vor die Rufnummer (nach dem optionalen Leerzeichen) einfügen.
Wenn die Einzelteile gemerkt werden sollen, dann halt noch ggf. () um die Teile setzen (und dabei darauf achten, daß die optionalen Leerzeichen an den Rändern nicht mit in den () stehen.
cu,
Andreas
Nochmals danke an alle für die sehr hilfreichen Antworten.
gudn tach!
[...] nicht nach Norm, sondern so, wie Leute es aufschreiben [...]
ack.
allerdings nutzen einige leute leerzeichen zur zifferngruppierung auch schon in den 5-stelligen vorwahlnummern und setzen nach der vorwahl einen bindestrich.
wuerde man das auch noch beruecksichtigen, wuerde der ausdruck halt noch etwas groesser oder man beschraenkt sich letztlich einfach auf
/^+?\d[0-9 /-]+\d\z/ ;-)
- eine Rufnummer (1. Ziffer keine 0, afaik bis zu 8 Ziffern, oft mit Leerzeichen dazwischen gruppiert)
[1-9](?: ?[1-9]){3,7}
ein typo: [1-9](?: ?[0-9]){3,7}
^ 0 statt 1
(die Forderung nach 1 + 3 Ziffern mindestens schließt 110, 112, 911 und ähnliche aus
...und auch einige rufnummern. zumindest 2001 gab es noch private 3-stellige rufnummern. hat sich das geaendert?
- eine Durchwahl (Bindestrich, bis zu 5 Ziffern, ggf. mit Leerzeichen dazwischen)
(?: ?-(?: ?[0-9]){1,5})?
also z.b. "-123 4" und "-12345" aber nicht "-123 45"?
[end-regexp]
(?:(?:+|00)[1-9][0-9]{0,3} ?)?(?:([1-9][0-9]{0,5})|0?[1-9][0-9]{0,5})(?: (?:/ ))?[1-9](?: ?[1-9]){3,7}(?: ?-(?: ?[0-9]){1,5})?
die leerzeichen vor oder nach dem slash (welches auch manchmal ein bindestrich ist) werden oft weggelassen.
und um die zifferngruppierungs-leerzeichen an beliebiger stelle zu beruecksichtigen, koennte man einfach vor dem ueberpruefen in einer kopie des strings alle leerzeichen killen und dann statt
/^(?:(?:+|00)[1-9][0-9]{0,3} ?)?(?:([1-9][0-9]{0,5})|0?[1-9][0-9]{0,5})(?: ?/ ?| )?[1-9](?: ?[0-9]){2,7}(?: ?-(?: ?[0-9]){1,5})?\z/
das etwas kuerzere
/^(?:(?:+|00)[1-9]\d{0,3})?(?:([1-9]\d{0,5})|0?[1-9]\d{0,5})[/-]?[1-9]\d{2,7}(?:-\d{1,5})?\z/
erhalten, mit dem nachteil, dass z.b. nach din formatierte nummern zwar erkannt, aber nicht mehr so leicht aufgeschluesselt werden koennten.
prost
seth
Hallo,
allerdings nutzen einige leute leerzeichen zur zifferngruppierung auch schon in den 5-stelligen vorwahlnummern
ja, aber wozu eigentlich?
Ich habe mal gelesen, das diene der besseren Lesbarkeit. Ich empfinde es aber genau umgekehrt, weil dadurch der Zusammenhang zerrissen wird. Beispielsweise hat Kamen in NRW die Vorwahl 02307. Wird das jetzt mit Leerzeichen gruppiert als "0 23 07" geschrieben, ist das IMHO schwieriger zu erfassen.
Auch die Gruppierung der Rufnummer mit Leerzeichen finde ich problematisch. Denn jeder Mensch prägt sich Zahlenkolonnen etwas anders ein. Viele können sich lange Ziffernreihen besser in Dreier- oder Vierergruppen merken, Telefonnummern werden aber oft in Pärchen gruppiert. Das stört dann und hat für die genannten Leute genau den gegenteiligen Effekt.
und setzen nach der vorwahl einen bindestrich.
Meiner Ansicht nach ist das sogar gebräuchlicher, als nach der Vorwahl ein Leerzeichen zu setzen. Die meisten Menschen schreiben die Vorwahl entweder in Klammern, oder trennen sie mit einem Schrägstrich oder Bindestrich vom Rest ab. Ein Leerzeichen zwischen Vorwahl und Rufnummer habe ich bisher nur in der DIN, aber noch nie "in freier Wildbahn" gesehen.
zumindest 2001 gab es noch private 3-stellige rufnummern. hat sich das geaendert?
Gibt es in sehr kleinen Ortsnetzen immer noch. Zwar werden bei neuen Anschlüssen AFAIK keine Nummern mehr mit weniger als 6 Ziffern vergeben, aber die bestehenden werden nicht geändert.
So long,
Martin
gudn tach!
allerdings nutzen einige leute leerzeichen zur zifferngruppierung auch schon in den 5-stelligen vorwahlnummern
ja, aber wozu eigentlich?
Ich habe mal gelesen, das diene der besseren Lesbarkeit.
ich glaube, dass das auch der grund fuer viele ist, es so zu machen.
Ich empfinde es aber genau umgekehrt
ich auch; aus denselben gruenden wie du.
u.a. deswegen halte ich mich an die erwaehnte din-norm.
Ein Leerzeichen zwischen Vorwahl und Rufnummer habe ich bisher nur in der DIN, aber noch nie "in freier Wildbahn" gesehen.
warum sollte ich dir auch meine nummer geben? ;-p
prost
seth
Hi,
- eine Rufnummer (1. Ziffer keine 0, afaik bis zu 8 Ziffern, oft mit Leerzeichen dazwischen gruppiert)
[1-9](?: ?[1-9]){3,7}ein typo: [1-9](?: ?[0-9]){3,7}
^ 0 statt 1
Richtig.
- eine Durchwahl (Bindestrich, bis zu 5 Ziffern, ggf. mit Leerzeichen dazwischen)
(?: ?-(?: ?[0-9]){1,5})?
also z.b. "-123 4" und "-12345" aber nicht "-123 45"?
Wieso?
Äüßere Klammer mit Fragezeichen: (?:)? - das ganze ist optional.
In der äußeren Klammer:
Leerzeichen (optional) und Minuszeichen.
Gefolgt von 1 bis 5 mal der inneren (?:)
Deren Inhalt ist ein optionales Leerzeichen und eine Ziffer.
aufgedröselt also (für den Fall von 5 Ziffern)
?- ?[0-9] ?[0-9] ?[0-9] ?[0-9] ?[0-9]
Ersetze ich die [0-9] durch die vorgegebenen Ziffern
?- ?1 ?2 ?3 ?4 ?5
So, jetzt noch ein paar optionale Leerzeichen rausschmeißen, bei denen, die erhalten bleiben, die ? weg:
-123 45
Also ist für die Durchwahl auch "-123 45" möglich.
die leerzeichen vor oder nach dem slash (welches auch manchmal ein bindestrich ist) werden oft weggelassen.
Daher hab ich sie ja auch per " ?" optional angegeben.
cu,
Andreas
gudn tach!
- eine Durchwahl (Bindestrich, bis zu 5 Ziffern, ggf. mit Leerzeichen dazwischen)
(?: ?-(?: ?[0-9]){1,5})?
also z.b. "-123 4" und "-12345" aber nicht "-123 45"?Wieso?
aeh, bin dumm!
bei deinem "wieso?" hab ich's auch gemerkt, sorry.
die leerzeichen vor oder nach dem slash (welches auch manchmal ein bindestrich ist) werden oft weggelassen.
Daher hab ich sie ja auch per " ?" optional angegeben.
noe. du schriebst
(?: (?:/ ))?
also (?: / )? und das laesst nur zu: "" oder " / "
gemeint hattest du evtl.
(?: (?:/ )?)?
und das laesst nur zu: "", " " oder " / "
deswegen war ja mein vorschlag (?: ?/ ?| )?
etwas kuerzer ginge auch / ?(?:/ ?)?/
prost
seth