Разделение строки в номер телефона и расширение с помощью preg_match -- php поле с участием regex поле с участием preg-replace поле с участием preg-match поле с участием phone-number пол Связанный проблема

splitting a string into a phone number and extension using preg_match


1
vote

проблема

русский

Так что я пытаюсь разделить строку, которая содержит номер телефона и расширение, так как иногда существует расширение в строке. Это моя попытка:

 <код> $tests[] = "941-751-6550 ext 2204"; $tests[] = "(941) 751-6550 ext 2204"; $tests[] = "(941)751-6550 ext 2204"; $tests[] = "9417516550 ext 2204"; $tests[] = "941-751-6550 e 2204"; $tests[] = "941-751-6550 ext 2204 "; $tests[] = "941-751-6550 extension 2204"; $tests[] = "941-751-6550 x2204"; $tests[] = "(941) 751-6550"; $tests[] = "(941)7516550"; $tests[] = "941-751-6550 "; $tests[] = "941-751-6550";  foreach ($tests as $test) {     preg_match('#([()s0-9-]+)(.+$)#',$test,$matches);     $phone = preg_replace('#[-()s]#','',$matches[1]);     $extension = preg_replace('#[^0-9]#','',$matches[2]);     if ($phone == '9417516550'          && ($extension == '2204'              || $extension == '0')) {                 echo "PASS: phone: $phone ext: $extension<br />";     } else {         echo "FAIL: phone: $phone ext: $extension<br />";     } }   

Однако, когда я запускаю эти тесты, чтобы увидеть, правильно ли он разбивает номер телефона и расширение, я получаю следующий вывод:

 <код> PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 FAIL: phone: 941751655 ext: 0 FAIL: phone: 941751655 ext: 0 FAIL: phone: 9417516550 ext:  FAIL: phone: 941751655 ext: 0   

Как вы можете видеть, он разрывается, когда я исключаю расширение в целом (последние четыре теста). Как я могу исправить <код> preg_match() regex, чтобы <код> public OrderViewModel(Table_Order ord) { OrderId = ord.OrderId, OrderSum = ord.OrderSum, OrderCurrencyId = ord.OrderCurrencyId, OrderCurrencyView = ord.Currency.CurrencyText } 0 строки выглядят как <код> public OrderViewModel(Table_Order ord) { OrderId = ord.OrderId, OrderSum = ord.OrderSum, OrderCurrencyId = ord.OrderCurrencyId, OrderCurrencyView = ord.Currency.CurrencyText } 1 ?

Английский оригинал

So I'm trying to split a string that contains a phone number and extension, as sometimes an extension exists in the string. This is my attempt:

$tests[] = "941-751-6550 ext 2204"; $tests[] = "(941) 751-6550 ext 2204"; $tests[] = "(941)751-6550 ext 2204"; $tests[] = "9417516550 ext 2204"; $tests[] = "941-751-6550 e 2204"; $tests[] = "941-751-6550 ext 2204 "; $tests[] = "941-751-6550 extension 2204"; $tests[] = "941-751-6550 x2204"; $tests[] = "(941) 751-6550"; $tests[] = "(941)7516550"; $tests[] = "941-751-6550 "; $tests[] = "941-751-6550";  foreach ($tests as $test) {     preg_match('#([()s0-9-]+)(.+$)#',$test,$matches);     $phone = preg_replace('#[-()s]#','',$matches[1]);     $extension = preg_replace('#[^0-9]#','',$matches[2]);     if ($phone == '9417516550'          && ($extension == '2204'              || $extension == '0')) {                 echo "PASS: phone: $phone ext: $extension<br />";     } else {         echo "FAIL: phone: $phone ext: $extension<br />";     } } 

However, when I run these tests to see if it properly splits the phone number and the extension, I get the following output:

PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 FAIL: phone: 941751655 ext: 0 FAIL: phone: 941751655 ext: 0 FAIL: phone: 9417516550 ext:  FAIL: phone: 941751655 ext: 0 

As you can see, it breaks when I exclude an extension altogether (the last four tests). How might I correct the preg_match() regex so that the FAIL: ... lines look like PASS: phone: 9417516550 ext: 0?

</div
              
   
   

Список ответов

2
 
vote
vote
Лучший ответ
 

<Код> (.+$) означает, что в конце строки должно быть 1 или более символа. Итак, если у вас ничего не будет после номера телефона - то номер телефона уменьшен на 1 символ.

Я советую использовать <код> (.*$) , что означает ноль или более символов.

 

(.+$) means that in the end of a line must be 1 or more symbol. So, if you have nothing after phone number - then your phone number is reduced by 1 symbol.

I advise to use (.*$) which means zero or more symbols.

</div
 
 
 
 
1
 
vote

Я бы сделал все это в <код> preg_match . Предполагая, что цифры не международные, я думаю, что это будет работать.

 <код> foreach ($tests as $test) {     preg_match('#(?(d{3}))?[-h]?(d{3})[-h]?(d{4})h*(?:e?x?t?(?:ension)?h(d+))?#',$test,$matches);     $phone = $matches[1] . $matches[2] . $matches[3];     $extension = !empty($matches[4]) ? $matches[4] : 0;     if ($phone == '9417516550'          && ($extension == '2204' || $extension == '0')) {             echo "PASS: phone: $phone ext: $extension<br />";     } else {          echo "FAIL: phone: $phone ext: $extension<br />";     } }   

Demo: https://eval.in/561720
Regex101 Demo: rel="nofollow"> https://regex101.com/r/mg9id1/1

 

I'd do it all in the preg_match. Assuming the numbers are non-international I think this would work.

foreach ($tests as $test) {     preg_match('#(?(d{3}))?[-h]?(d{3})[-h]?(d{4})h*(?:e?x?t?(?:ension)?h(d+))?#',$test,$matches);     $phone = $matches[1] . $matches[2] . $matches[3];     $extension = !empty($matches[4]) ? $matches[4] : 0;     if ($phone == '9417516550'          && ($extension == '2204' || $extension == '0')) {             echo "PASS: phone: $phone ext: $extension<br />";     } else {          echo "FAIL: phone: $phone ext: $extension<br />";     } } 

Demo: https://eval.in/561720
Regex101 Demo: https://regex101.com/r/mG9iD1/1

</div
 
 
 
 
1
 
vote

Это работает как ожидалось, только что тестировали.

 <код> foreach ($tests as $test) {     preg_match('#([()0-9-]+s*[()0-9-]+)s*(.*$)#',$test,$matches);     $phone = preg_replace('#[-()s]#','',$matches[1]);     $extension = ($matches[2] == "") ? '0' : preg_replace('#[^0-9]#','',$matches[2]);     if ($phone == '9417516550'         && ($extension == '2204'             || $extension == '0')) {                 echo "PASS: phone: $phone ext: $extension<br /> ";     } else {         echo "FAIL: phone: $phone ext: $extension<br /> ";     } }   

с минимальными изменениями в вашем коде.

 

This works as expected, just tested.

foreach ($tests as $test) {     preg_match('#([()0-9-]+s*[()0-9-]+)s*(.*$)#',$test,$matches);     $phone = preg_replace('#[-()s]#','',$matches[1]);     $extension = ($matches[2] == "") ? '0' : preg_replace('#[^0-9]#','',$matches[2]);     if ($phone == '9417516550'         && ($extension == '2204'             || $extension == '0')) {                 echo "PASS: phone: $phone ext: $extension<br /> ";     } else {         echo "FAIL: phone: $phone ext: $extension<br /> ";     } } 

With minimal changes on your code.

</div
 
 
   
   
0
 
vote

от вашего примера, похоже, он не удается, когда ничего не найдено как Ext.

решение - это то, чтобы int <код> $extension как это:

 <код> $extension = intval($extension); //If nothing found will be 0   

После этого мы уверены, что у нас есть <код> integer , и мы можем изменить оператор if to:

 <код> || $extension === 0)) {   
 

From you example it looks like it fails when nothing found as ext.

A solution is to cast to int $extension like this:

$extension = intval($extension); //If nothing found will be 0 

After this we are sure that we have an integer and we can change the if statement to:

|| $extension === 0)) { 
</div
 
 
0
 
vote
 <код> $pns = <<< LOL 941-751-6550 ext 2204 (941) 751-6550 ext 2204 (941)751-6550 ext 2204 9417516550 ext 2204 941-751-6550 e 2204 941-751-6550 ext 2204  941-751-6550 extension 2204 941-751-6550 x2204 (941) 751-6550 (941)7516550 941-751-6550 941-751-6550 LOL;  preg_match_all('/^([(d )-]+)s?(?:e.*?|x.*?)?(d+)?$/sim', $pns, $matches, PREG_PATTERN_ORDER); for ($i = 0; $i < count($matches[1]); $i++) {     $phone = preg_replace('#[-()s]#','', $matches[1][$i]);     $extension = preg_replace('#[^0-9]#','', $matches[2][$i]);     if ($phone == '9417516550' && $extension == '2204') {              echo "PASS: phone: $phone ext: $extension ";     } else {              echo "FAIL: phone: $phone ext: 0 ";     } }   

<Сильные> Вывод:

 <код> (.*$)0  

ideone demo

 
$pns = <<< LOL 941-751-6550 ext 2204 (941) 751-6550 ext 2204 (941)751-6550 ext 2204 9417516550 ext 2204 941-751-6550 e 2204 941-751-6550 ext 2204  941-751-6550 extension 2204 941-751-6550 x2204 (941) 751-6550 (941)7516550 941-751-6550 941-751-6550 LOL;  preg_match_all('/^([(d )-]+)s?(?:e.*?|x.*?)?(d+)?$/sim', $pns, $matches, PREG_PATTERN_ORDER); for ($i = 0; $i < count($matches[1]); $i++) {     $phone = preg_replace('#[-()s]#','', $matches[1][$i]);     $extension = preg_replace('#[^0-9]#','', $matches[2][$i]);     if ($phone == '9417516550' && $extension == '2204') {              echo "PASS: phone: $phone ext: $extension ";     } else {              echo "FAIL: phone: $phone ext: 0 ";     } } 

Output:

PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 FAIL: phone: 9417516550 ext: 0 FAIL: phone: 9417516550 ext: 0 FAIL: phone: 9417516550 ext: 0 FAIL: phone: 9417516550 ext: 0 

Ideone Demo

</div
 
 
0
 
vote

Честно говоря, вам лучше отменить не числовые символы, затем расщепляю что-либо после первого 10 в качестве расширения. Это концептуально эквивалентно, но более простое и надежное, а более эффективное, чем управление несколькими регенами, которые по своей природе медленные.

 <код> (.*$)1  

Выход:

 <код> (.*$)2  
 

Honestly, you're better off stripping the non-numeric characters, then splitting off anything after the first 10 as the extension. It's conceptually equivalent, but more straightforward and foolproof, and more efficient than running through multiple regexes, which are inherently slow.

foreach($tests as $test){     $phone = preg_replace("/[^0-9]/", "", $test);     $extension = substr($phone,10);     $phone = substr($phone,0,10);     if(empty($extension)){          $extension = '0';     }     if ($phone == '9417516550'         && ($extension == '2204'             || $extension == '0')) {                 echo "PASS: phone: $phone ext: $extension<br /> ";     } else {         echo "FAIL: phone: $phone ext: $extension<br /> ";     } } 

Output:

PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 2204 PASS: phone: 9417516550 ext: 0 PASS: phone: 9417516550 ext: 0 PASS: phone: 9417516550 ext: 0 PASS: phone: 9417516550 ext: 0 
</div
 
 

Связанный проблема

6  Как вы заставляете гравитар на отображение идентификатора  ( How do you force gravatar into displaying identicon ) 
Есть ли способ заставить Gravatar до всегда Вернуть identicon url? P >. Единственный способ, которым я нашел до сих пор: <Код> ?forcedefault=1&default=my...

19  Как я могу получить простоту PHP (развертывание), но мощность Perl?  ( How can i get phps deployment simplicity but perls power ) 
Я презираю язык PHP, и я совершенно уверен, что я не одинок. Но великая вещь о PHP - это способ, которым mod_php принимает и скрывает детали образования горы ...

1  Как читать защищенные данные из API API / PHP API Facebook API / PHP  ( How to read protected data from facebook ads api php sdk ) 
Я получаю защищенный объект, возвращенный из вызова API в рекламу Facebook. Я звоню с <код> $campaigns = $account->getAdCampaigns($fields, $params); и...

0  WordPress Query 'Orderby' => 'meta_value' списки 10 до 9  ( Wordpress query orderby meta value lists 10 before 9 ) 
Я создаю сайт WordPress для моего отца в ресторане закона. Каждый курс имеет номер, который я перечисляю с использованием «orderby» расширенного пользовательс...

2  Сделать HTACCESS не применять для некоторых подпапок  ( Make htaccess to not be applied for some subfolders ) 
Я использую эту htaccess для моего приложения. <код> <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQ...

0  Если запись в таблице A не существует в таблице b сделать что-то, как бы я пошел по этому поводу?  ( If record in table a does not exist in table b do something how would i go abou ) 
У меня есть таблица A с полем, называемым писем, мне нужно проверить таблицу B, которая также имеет поле под названием Emails. Если электронное письмо в табли...

0  Авто не показывая результат jQuery  ( Auto complete not showing result jquery ) 
Я пытаюсь создать автоматическую комплектацию, используя jqueryui.i am echo ing a jquery a age ange Результат базы данных из удаленного поиска файлов.php.it п...

3  Рассчитать размер плитки карты Google на уровне масштабирования N  ( Calculate tile size of google map at zoom level n ) 
Эй. Эй. У меня есть приложение MAPS, которое использует карты Google. Я получаю границы от карты, а затем я делаю некоторые кластеризащие маркеры на этой терр...

21  Нарезка многомерного массива PHP через один из его элементов  ( Slicing a multi dimensional php array across one of its elements ) 
сказать, например, вы только что запрашивали базу данных, и вы получили этот 2D-массив. <код> $results = array( array('id' => 1, 'name' => 'red' , 'spi...

1  Запрос CURL PHP для ошибки возврата веб-службы  ( Php curl request for web service returning error ) 
Я продолжаю получать ошибку: «Не удалось отменить сущность Serialize» при выполнении запроса на отдых ниже. Я предполагаю, что это связано с форматированием м...

1  Экспорт Результат MySQL для Excel  ( Export mysql result to excel ) 
Я нашел небольшой скрипт, который будет экспортировать информацию в файл XLS, но я не могу, кажется, не могу работать. Оригинальный код найден здесь: http: /...

1  Как использовать URLFetch в PHP  ( How to use urlfetch in php ) 
Где я могу получить файлы библиотеки API или PHP для использования URLFetch? Я искал в нескольких местах в документации по двигателю Google App. Мне удалось...

0  Symfony2 параметр или проблема кэша  ( Symfony2 parameter or cache issue ) 
Я использую Symfony2 для моего приложения и приложения, работая нормально в Windows, но когда я загружаю его на сервер (Ubuntu 12.04 LTS), дает следующую ошиб...

0  Cookie не доступно на сайте  ( Cookie not available sitewide ) 
У меня есть два вопроса с настройкой и извлечением файлов cookie. cookie загружается, но нельзя вызывать, пока страница не будет обновлена. Это означает, ч...

1  Почему PHP не может создать файл, даже с 777 разрешениями?  ( Why cant php create a file even with 777 permissions ) 
У меня есть тестовый сервер виртуальной арки Linux с Xampp, работающим на моем ноутбуке, и я не могу получить PHP для создания новых файлов, даже с разрешения...




© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.