add leadiing country code while seraching numbers

This commit is contained in:
Julien Fastré 2022-03-02 21:02:32 +01:00
parent 6171a221b2
commit c0ec64e4be
2 changed files with 38 additions and 9 deletions

View File

@ -11,8 +11,10 @@ declare(strict_types=1);
namespace Chill\MainBundle\Search\Utils; namespace Chill\MainBundle\Search\Utils;
use libphonenumber\PhoneNumberUtil;
use LogicException; use LogicException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use function count; use function count;
use function implode; use function implode;
use function preg_match; use function preg_match;
@ -24,6 +26,13 @@ class ExtractPhonenumberFromPattern
{ {
private const PATTERN = '([\\+]{0,1}[0-9\\ ]{5,})'; private const PATTERN = '([\\+]{0,1}[0-9\\ ]{5,})';
private string $defaultCarrierCode;
public function __construct(ParameterBagInterface $parameterBag)
{
$this->defaultCarrierCode = $parameterBag->get('chill_main')['phone_helper']['default_carrier_code'];
}
public function extractPhonenumber(string $subject): SearchExtractionResult public function extractPhonenumber(string $subject): SearchExtractionResult
{ {
$matches = []; $matches = [];
@ -35,11 +44,20 @@ class ExtractPhonenumberFromPattern
foreach (str_split(trim($matches[0])) as $key => $char) { foreach (str_split(trim($matches[0])) as $key => $char) {
switch ($char) { switch ($char) {
case '+':
if (0 === $key) {
$phonenumber[] = $char;
} else {
throw new LogicException('should not match not alnum character');
}
break;
case '0': case '0':
$length++; $length++;
if (0 === $key) { if (0 === $key) {
$phonenumber[] = '+32'; $util = PhoneNumberUtil::getInstance();
$phonenumber[] = '+'.$util->getCountryCodeForRegion($this->defaultCarrierCode);
} else { } else {
$phonenumber[] = $char; $phonenumber[] = $char;
} }

View File

@ -13,6 +13,7 @@ namespace Search\Utils;
use Chill\MainBundle\Search\Utils\ExtractPhonenumberFromPattern; use Chill\MainBundle\Search\Utils\ExtractPhonenumberFromPattern;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
/** /**
* @internal * @internal
@ -22,17 +23,25 @@ final class ExtractPhonenumberFromPatternTest extends KernelTestCase
{ {
public function provideData() public function provideData()
{ {
yield ['Diallo', 0, [], 'Diallo', 'no phonenumber']; yield ['BE', 'Diallo', 0, [], 'Diallo', 'no phonenumber'];
yield ['Diallo 15/06/2021', 0, [], 'Diallo 15/06/2021', 'no phonenumber and a date']; yield ['BE', 'Diallo 15/06/2021', 0, [], 'Diallo 15/06/2021', 'no phonenumber and a date'];
yield ['Diallo 0486 123 456', 1, ['+32486123456'], 'Diallo', 'a phonenumber and a name']; yield ['BE', 'Diallo 0486 123 456', 1, ['+32486123456'], 'Diallo', 'a phonenumber and a name'];
yield ['Diallo 123 456', 1, ['123456'], 'Diallo', 'a number and a name, without leadiing 0']; yield ['BE', 'Diallo 123 456', 1, ['123456'], 'Diallo', 'a number and a name, without leadiing 0'];
yield ['123 456', 1, ['123456'], '', 'only phonenumber']; yield ['BE', '123 456', 1, ['123456'], '', 'only phonenumber'];
yield ['0123 456', 1, ['+32123456'], '', 'only phonenumber with a leading 0']; yield ['BE', '0123 456', 1, ['+32123456'], '', 'only phonenumber with a leading 0'];
yield ['FR', '123 456', 1, ['123456'], '', 'only phonenumber'];
yield ['FR', '0123 456', 1, ['+33123456'], '', 'only phonenumber with a leading 0'];
yield ['FR', 'Diallo 0486 123 456', 1, ['+33486123456'], 'Diallo', 'a phonenumber and a name'];
yield ['FR', 'Diallo +32486 123 456', 1, ['+32486123456'], 'Diallo', 'a phonenumber and a name'];
} }
/** /**
@ -44,9 +53,11 @@ final class ExtractPhonenumberFromPatternTest extends KernelTestCase
* @param mixed $filteredSubject * @param mixed $filteredSubject
* @param mixed $msg * @param mixed $msg
*/ */
public function testExtract($subject, $expectedCount, $expected, $filteredSubject, $msg) public function testExtract(string $defaultCarrierCode, $subject, $expectedCount, $expected, $filteredSubject, $msg)
{ {
$extractor = new ExtractPhonenumberFromPattern(); $extractor = new ExtractPhonenumberFromPattern(new ParameterBag(['chill_main' => [
'phone_helper' => ['default_carrier_code' => $defaultCarrierCode]
]]));
$result = $extractor->extractPhonenumber($subject); $result = $extractor->extractPhonenumber($subject);
$this->assertCount($expectedCount, $result->getFound()); $this->assertCount($expectedCount, $result->getFound());