PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |

16-07-2012, 12:05
|
mr_apollon
Registrierter Benutzer
|
|
Registriert seit: May 2009
Beiträge: 38
|
|
Das perfekte Telefonnummern-RegEx
Hallo an alle,
ich bin am verzweifeln:
mit folgendem RegEx
Code:
preg_match('/^(\+[0-9]{2,3})[\d\s\/\(\)-]/',$nummer);
will ich bei Telefonnummern prüfen ob nur Zahlen, Leerzeichen, Minus, Slash und Leerzeichen verwendet werden. Nur am Anfang soll ein Plus erlaubt sein, wenn es von 2-3 Zahlen gefolgt wird.
Die ganze Sache will aber einfach nicht zuverlässig laufen.
Im zweiten Schritt soll aus einer Nummer alle Zeichen ausser Zahlen entfernt werden. Ausnahme: nur ein führendes Plus soll durch 00 ersetzt werden
=> da komme ich garnicht weiter
Wäre schön wenn jemand helfen kann
|

16-07-2012, 14:36
|
rossixx
Registrierter Benutzer
|
|
Registriert seit: Jul 2003
Ort: Berlin
Beiträge: 512
|
|
nimm doch für das eine
PHP-Code:
$new_nr = str_replace( '+', '00', $old_nr );
|

16-07-2012, 21:47
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 849
|
|
Erstmal: Zahlen !== Ziffern
*klugscheiß*
Zitat:
Zitat von mr_apollon
... will ich bei Telefonnummern prüfen ob nur Zahlen, Leerzeichen, Minus, Slash und Leerzeichen verwendet werden.
|
Warum? 1-800-FLOWERS ist eine gültige Telefonnummer.
Und es gibt Menschen, die Telefonvorwahlen in Klammern schreiben, wie bspw. (0815) 47 11.
Siehe auch: Wikipedia - Schreibweisen von Rufnummern.
Zitat:
Nur am Anfang soll ein Plus erlaubt sein, wenn es von 2-3 Zahlen gefolgt wird.
|
Hmm, und damit wäre "+49" eine gültige Telefonnummer?
Zitat:
Im zweiten Schritt soll aus einer Nummer alle Zeichen ausser Zahlen entfernt werden. Ausnahme: nur ein führendes Plus soll durch 00 ersetzt werden
|
Mit einem einfachen Regex bekommst du beide Anforderungen nicht unter einen Hut. Und da der Modifier /e verpönt ist, brauchen wir preg_replace_callback() und eine anonyme Funktion, die Entscheidung vornimmt[0]:
PHP-Code:
function mangle_phone_number(
$input
) {
return preg_replace_callback(
'/(?:\A(\+)|[^0-9]+)/',
function ($h) {
return isset ($h[1][0]) ? '00' : '';
},
$input
);
}
'\A(\+)' fängt ein am Anfang stehendes Plus-Zeichen ein.
[^0-9] frisst alles, was KEINE (ASCII-)Ziffer ist.
Da das Plus in Klammern steht, merkt sich der Regex, wenn er dieses Suchmuster findet. Das fragen wir ab und "returnieren" '00'. Ansonsten war es ein Nicht-Ziffern-Zeichen oder mehrere davon. Das ersetzen wir durch einen Leerstring.
PHP-Code:
$tests = array (
'(0815) 47 11',
'+498154711',
'0049 815 47-11',
'11 8 33',
'0900 123 456 7',
'365',
'1-800-FLOWERS',
);
foreach ($tests as $test) {
$mangled = mangle_phone_number($test);
print("\r\n");
printf('%S => %S', $test, $mangled);
}
--
*update*
Ohne Callback-Gedöns geht es auch, wenn man (wie meine Nachposterin es tat) einfach zweimal preg_replace() drüberlaufen lässt:
PHP-Code:
// ...
// ersetzt ein führendes Plust durch 00
$return = preg_replace('/\A\+/', '00', $input);
// entfernt Nicht-Ziffern
return preg_replace('/[^0-9]+/', '', $return);
// ...
Geändert von fireweasel (17-07-2012 um 11:42 Uhr)
|

16-07-2012, 22:33
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.709
|
|
Hallo,
mein Senf dazu:
PHP-Code:
<?php
$numbers = [
"+43 911 6348-24",
"(030) 86402357",
"089 4359045",
"0 22 56 / 4 35 90 45",
"0030-795-463872"
];
$valid = "<^((\\+|00)[1-9]\\d{0,3}|0 ?[1-9]|\\(00? ?[1-9][\\d ]*\\))[\\d\\-/ ]*$>";
foreach ($numbers as $number) {
if (preg_match($valid, $number)) {
$number = preg_replace("<^\\+>", "00", $number);
$number = preg_replace("<\\D+>", "", $number);
echo $number, "\n";
}
}
?>
Länderkennzahlen haben nicht nur 2 bis 3 Ziffern, sondern 1 bis 4, es sei denn, du schließt bestimmte Regionen (z. B. Nordamerika) sowieso aus, dann reichen wirklich 2 bis 3 für Europa.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

13-08-2012, 11:02
|
mr_apollon
Registrierter Benutzer
|
|
Registriert seit: May 2009
Beiträge: 38
|
|
Hallo an alle,
danke für Eure Hilfe.
Besonderen dank an AmicaNoctis  - wirklich geniale Lösung!
Viele Grüße
Apollon
|

13-08-2012, 20:35
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.529
|
|
Zitat:
Zitat von rossixx
nimm doch für das eine
PHP-Code:
$new_nr = str_replace( '+', '00', $old_nr );
|
Dann ist es aber keine international gültige Telefonnummer mehr, weil je nach Anschluss eine Doppelnull etwas anderes bewirken kann. zB. wählt man von der Schweiz nach Deutschland 0049 vor, von Kuba nach Deutschland 11949, von den USA nach Deutschland 01149, von Russland nach Deutschland 81049, usw.
Geändert von h3ll (13-08-2012 um 20:39 Uhr)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
Aktuelle PHP Scripte
Top-Side.de Php News Script
Newsscript mit Smilies, BB-Code, Löschfunktion, Editierfunktion, Kommentarfunktion, Seiten- bzw. Blätterfunktion
14.04.2018
webmaster10 | Kategorie: PHP/ News
|
tsShoutbox
Textbasierte Shoutbox (kein MySQL nötig) mit Admin-Control-Panel zum Verwalten der Farbeinstellungen und Shoutboxoptionen, Archiv, Löschfunktion, Seiten- bzw. Blätterfunktion, Smilies, Badword-Filter, Überprüfung falscher Eingaben.
10.04.2018
webmaster10 | Kategorie: PHP/ Shoutbox
|
Domain Checker v1.1 Pro
Domainchecker (Whois) für folgende Domains: .de, .com, .net, .org, .info, .biz, .at, .ch, .li, .co.uk, .tv, .cc, .dk, .it, .ws
10.04.2018
webmaster10 | Kategorie: PHP/ Domains
|
Alle PHP Scripte anzeigen
|