From 9fb42ccd724e307c0067a541c463c45bd44437b0 Mon Sep 17 00:00:00 2001 From: Romain Monteil Date: Mon, 5 Feb 2024 15:51:49 +0100 Subject: [PATCH] Fix mobile phone number pattern for France --- src/Faker/Provider/fr_FR/PhoneNumber.php | 48 +++++++++++++------ test/Faker/Provider/fr_FR/PhoneNumberTest.php | 16 ++++++- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/Faker/Provider/fr_FR/PhoneNumber.php b/src/Faker/Provider/fr_FR/PhoneNumber.php index 69c681d915..aec0bbd51b 100644 --- a/src/Faker/Provider/fr_FR/PhoneNumber.php +++ b/src/Faker/Provider/fr_FR/PhoneNumber.php @@ -13,7 +13,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '+33 (0)3 ## ## ## ##', '+33 (0)4 ## ## ## ##', '+33 (0)5 ## ## ## ##', - '+33 (0)6 ## ## ## ##', + '+33 (0)6 {{phoneNumber06WithSeparator}}', '+33 (0)7 {{phoneNumber07WithSeparator}}', '+33 (0)8 {{phoneNumber08WithSeparator}}', '+33 (0)9 ## ## ## ##', @@ -23,7 +23,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '+33 3 ## ## ## ##', '+33 4 ## ## ## ##', '+33 5 ## ## ## ##', - '+33 6 ## ## ## ##', + '+33 6 {{phoneNumber06WithSeparator}}', '+33 7 {{phoneNumber07WithSeparator}}', '+33 8 {{phoneNumber08WithSeparator}}', '+33 9 ## ## ## ##', @@ -33,7 +33,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '03########', '04########', '05########', - '06########', + '06{{phoneNumber06}}', '07{{phoneNumber07}}', '08{{phoneNumber08}}', '09########', @@ -43,7 +43,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '03 ## ## ## ##', '04 ## ## ## ##', '05 ## ## ## ##', - '06 ## ## ## ##', + '06 {{phoneNumber06WithSeparator}}', '07 {{phoneNumber07WithSeparator}}', '08 {{phoneNumber08WithSeparator}}', '09 ## ## ## ##', @@ -52,13 +52,13 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber // Mobile phone numbers start by 06 and 07 // 06 is the most common prefix protected static $mobileFormats = [ - '+33 (0)6 ## ## ## ##', - '+33 6 ## ## ## ##', + '+33 (0)6 {{phoneNumber06WithSeparator}}', + '+33 6 {{phoneNumber06WithSeparator}}', '+33 (0)7 {{phoneNumber07WithSeparator}}', '+33 7 {{phoneNumber07WithSeparator}}', - '06########', + '06{{phoneNumber06}}', '07{{phoneNumber07}}', - '06 ## ## ## ##', + '06 {{phoneNumber06WithSeparator}}', '07 {{phoneNumber07WithSeparator}}', ]; @@ -73,6 +73,26 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber '+33#########', ]; + public function phoneNumber06() + { + $phoneNumber = $this->phoneNumber06WithSeparator(); + + return str_replace(' ', '', $phoneNumber); + } + + /** + * Only 0601 to 0638, 0640 to 0689, 0695 and 0698 to 0699 are acceptable prefixes with 06 + * + * @see https://www.arcep.fr/la-regulation/grands-dossiers-thematiques-transverses/la-numerotation.html#c8961 + * @see https://www.itu.int/itu-t/nnp/#/numbering-plans?country=France%C2%A0&code=33 + */ + public function phoneNumber06WithSeparator() + { + $regex = '([0-24-8]\d|3[0-8]|9[589])( \d{2}){3}'; + + return static::regexify($regex); + } + public function phoneNumber07() { $phoneNumber = $this->phoneNumber07WithSeparator(); @@ -81,16 +101,16 @@ public function phoneNumber07() } /** - * Only 073 to 079 are acceptable prefixes with 07 + * Only 0730 to 0789 are acceptable prefixes with 07 * - * @see http://www.arcep.fr/index.php?id=8146 + * @see https://www.arcep.fr/la-regulation/grands-dossiers-thematiques-transverses/la-numerotation.html#c8961 + * @see https://www.itu.int/itu-t/nnp/#/numbering-plans?country=France%C2%A0&code=33 */ public function phoneNumber07WithSeparator() { - $phoneNumber = $this->generator->numberBetween(3, 9); - $phoneNumber .= $this->numerify('# ## ## ##'); + $regex = '([3-8]\d)( \d{2}){3}'; - return $phoneNumber; + return static::regexify($regex); } public function phoneNumber08() @@ -123,7 +143,7 @@ public function phoneNumber08WithSeparator() { $regex = '([012]{1}\d{1}|(9[1-357-9])( \d{2}){3}'; - return $this->regexify($regex); + return static::regexify($regex); } /** diff --git a/test/Faker/Provider/fr_FR/PhoneNumberTest.php b/test/Faker/Provider/fr_FR/PhoneNumberTest.php index 20db5bb351..973b421b49 100644 --- a/test/Faker/Provider/fr_FR/PhoneNumberTest.php +++ b/test/Faker/Provider/fr_FR/PhoneNumberTest.php @@ -16,16 +16,28 @@ public function testMobileNumber(): void self::assertMatchesRegularExpression('/^(\+33 |\+33 \(0\)|0)(6|7)(?:(\s{1})?\d{2}){4}$/', $mobileNumber); } + public function testMobileNumber06Format(): void + { + $mobileNumberFormat = $this->faker->phoneNumber06(); + self::assertMatchesRegularExpression('/^([0-24-8]\d|3[0-8]|9[589])(\d{2}){3}$/', $mobileNumberFormat); + } + + public function testMobileNumber06WithSeparatorFormat(): void + { + $mobileNumberFormat = $this->faker->phoneNumber06WithSeparator(); + self::assertMatchesRegularExpression('/^([0-24-8]\d|3[0-8]|9[589])( \d{2}){3}$/', $mobileNumberFormat); + } + public function testMobileNumber07Format(): void { $mobileNumberFormat = $this->faker->phoneNumber07(); - self::assertMatchesRegularExpression('/^([3-9]{1})\d(\d{2}){3}$/', $mobileNumberFormat); + self::assertMatchesRegularExpression('/^([3-8]{1})\d(\d{2}){3}$/', $mobileNumberFormat); } public function testMobileNumber07WithSeparatorFormat(): void { $mobileNumberFormat = $this->faker->phoneNumber07WithSeparator(); - self::assertMatchesRegularExpression('/^([3-9]{1})\d( \d{2}){3}$/', $mobileNumberFormat); + self::assertMatchesRegularExpression('/^([3-8]{1})\d( \d{2}){3}$/', $mobileNumberFormat); } public function testServiceNumber(): void