From b4eb6963bec3604ba4662c12b305649e45f15918 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 | 50 +++++++++++++------ test/Faker/Provider/fr_FR/PhoneNumberTest.php | 24 ++++++--- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/Faker/Provider/fr_FR/PhoneNumber.php b/src/Faker/Provider/fr_FR/PhoneNumber.php index 69c681d915..22f518d67d 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() @@ -121,9 +141,9 @@ public function phoneNumber08() */ public function phoneNumber08WithSeparator() { - $regex = '([012]{1}\d{1}|(9[1-357-9])( \d{2}){3}'; + $regex = '([012]\d|(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..edec757099 100644 --- a/test/Faker/Provider/fr_FR/PhoneNumberTest.php +++ b/test/Faker/Provider/fr_FR/PhoneNumberTest.php @@ -13,37 +13,49 @@ final class PhoneNumberTest extends TestCase public function testMobileNumber(): void { $mobileNumber = $this->faker->mobileNumber(); - self::assertMatchesRegularExpression('/^(\+33 |\+33 \(0\)|0)(6|7)(?:(\s{1})?\d{2}){4}$/', $mobileNumber); + self::assertMatchesRegularExpression('/^(\+33 |\+33 \(0\)|0)([67])(?:(\s)?\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]\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]\d)( \d{2}){3}$/', $mobileNumberFormat); } public function testServiceNumber(): void { $serviceNumber = $this->faker->serviceNumber(); - self::assertMatchesRegularExpression('/^(\+33 |\+33 \(0\)|0)8(?:(\s{1})?\d{2}){4}$/', $serviceNumber); + self::assertMatchesRegularExpression('/^(\+33 |\+33 \(0\)|0)8(?:(\s)?\d{2}){4}$/', $serviceNumber); } public function testServiceNumberFormat(): void { $serviceNumberFormat = $this->faker->phoneNumber08(); - self::assertMatchesRegularExpression('/^((0|1|2)\d{1}|9[^46])\d{6}$/', $serviceNumberFormat); + self::assertMatchesRegularExpression('/^(([012])\d|9[^46])\d{6}$/', $serviceNumberFormat); } public function testServiceNumberWithSeparatorFormat(): void { $serviceNumberFormat = $this->faker->phoneNumber08WithSeparator(); - self::assertMatchesRegularExpression('/^((0|1|2)\d{1}|9[^46])( \d{2}){3}$/', $serviceNumberFormat); + self::assertMatchesRegularExpression('/^(([012])\d|9[^46])( \d{2}){3}$/', $serviceNumberFormat); } public function testE164PhoneNumberFormat(): void