2017-07-18 1 views
3

Ich möchte Telefonnummern überprüfen. Die einzigen gültigen Telefonnummern beginnen wie folgt: +36 20 | +36 30 | +36 31 | +36 70Wie kann man überprüfen, dass das fünfte und sechste Zeichen eine bestimmte zweistellige Zahl sind?

Mein Code sieht so aus, aber jetzt können Sie +36 21 oder +36 71 eingeben, die ich vermeiden möchte. Wie kann ich nach einer zweistelligen Nummer suchen? Wie 70 oder 30.

$phone = '+36 70 123 4567'; 

if (preg_match('|^\+36 [237][01] [1-9][0-9]{2} [0-9]{2}[0-9]{2}$|', $phone)) { 
    echo 'phone number is good'; 
} 
+0

Verwenden Abwechslungen, '(?: [237] 0 | 31)' statt '[237] [01]' –

Antwort

3

Wenn Sie einige sehr spezifische Zahlen wollen:

/^\+36(20|30|31).../ 

Mit Set-Notation ([237][01]) öffnet sich viel zu viele andere Möglichkeiten, wie Sie beobachtet haben.

+0

Danke, einfach und Arbeiten fein! –

1

können Sie verwenden nicht-einfangenden Gruppen die Werte, damit Sie müssen angeben:

^\+36 (?:[237]0|31) [1-9][0-9]{2} [0-9]{4}$ 

anzeigen regex demo

Die [237][01] (zwei aufeinanderfolgende Charakterklassen) entspricht 2 oder 3 oder 7 gefolgt von 0 oder 1, während (?:[237]0|31) entwederentspricht, 3, 7 und dann 0 oder 31 Char-Sequenz.

Das ganze Muster entspricht:

  • ^ - Beginn der stirng
  • +36 - +36 und einen Raum
  • (?:[237]0|31) - siehe Beschreibung oben
  • - Raum
  • [1-9] - ein Zeichen Klasse, die einer einzelnen Ziffer von 1 zuentspricht(ausgenommen 0)
  • [0-9]{2} - 2 beliebige ASCII-Ziffern (0-9)
  • - space
  • [0-9]{4}-4 digits
  • $ - Ende der Schnur.

Beachten Sie, dass statt wörtliche Räume, können Sie \s verwenden, die alle Leerzeichen entspricht, und 1 oder 0 Vorkommen übereinstimmen (wenn das Leerzeichen optional) können Sie hinzufügen ? (oder * 0+ Ereignisse anzupassen) nach \s - \s?/\s*.

+0

Wow! Vielen Dank! Ich habe eine andere Lösung verwendet, aber Ihre detaillierte Beschreibung hat mir sehr geholfen zu verstehen, was los ist :) –

+0

@ CsordásGergő Nun, Upvoting ist genug, um Danke zu sagen :) Wenn Sie eine andere Antwort am besten für Sie gefunden haben, ist es in Ordnung. –

1
$re = '/\+36\s(20|30|31|70)\s.*/'; 
$str = '+36 20 4145654'; 

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); 

var_dump($matches); 

Hier verwendete ich \s alle Leerzeichen übereinstimmen.Natürlich können Sie auch nur Leerzeichen wie folgt verwenden:

$re = '/\+36 (20|30|31|70) .*/'; 
Verwandte Themen