Разбор имени и телефонных номеров из строки - PullRequest
1 голос
/ 24 мая 2011

Мне нужно преобразовать обычные текстовые формы заказа (которые я не могу контролировать) в отдельные поля базы данных.

Как часть этого, я получаю 2 варианта этой части заказа, для которых мне нужно Имя, Мобильный (сотовый) и стационарный телефон (если предоставляется). Текст приходит так:

FirstName1 Surname1 on 0412 555 555 or 9555 55555 ,  FirstName2 Surname2 on 0555 555 555 or 

или может быть только Mobile (Cell) для 1 из них, например

FirstName1 Surname1 on 0412 555 555 ,  FirstName2 Surname2 on 0555 555 555 or 

(ОБРАТИТЕ ВНИМАНИЕ, что окончательное 'или' не является ошибкой, именно так оно и получено).

Какой лучший способ справиться с этим? Взрывается через запятую, а затем взрывается через 'или', чтобы увидеть, есть ли более 1 телефон?

Regex - не моя сила, поэтому взорвать внушение, но предложения с радостью приняты.

Спасибо ...

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Я бы использовал разнесение и разделение так:

$lines = array('FirstName1 Surname1 on 0412 555 555 or 9555 55555 ,  FirstName2 Surname2 on 0555 555 555 or ','FirstName1 Surname1 on 0412 555 555 ,  FirstName2 Surname2 on 0555 555 555 or ');

foreach($lines as $line) {
  $persons = explode(',', $line);
  foreach($persons as $person) {
    $infos = preg_split('/on|or/', $person);
    echo "name : ",$infos[0],"\n";
    echo "phone1 : ",$infos[1],"\n";
    if (isset($infos[2])) echo "phone2 : ",$infos[2],"\n";
  }
}

вывод:

name : FirstName1 Surname1
phone1 :  0412 555 555
phone2 :  9555 55555
name :   FirstName2 Surname2
phone1 :  0555 555 555
phone2 :
name : FirstName1 Surname1
phone1 :  0412 555 555
name :   FirstName2 Surname2
phone1 :  0555 555 555
phone2 :
0 голосов
/ 24 мая 2011

Вот скрипт, использующий подшаблоны регулярных выражений для нужных вам полей:

<?php

// FirstName1 Surname1 on 0412 555 555 or 9555 55555 ,  FirstName2 Surname2 on 0555 555 555 or
define('P1_NAME_1',1);
define('P1_MOBILE_1',2);
define('P1_LANDLINE_1',3);
define('P1_NAME_2',4);
define('P1_MOBILE_2',5);

$p1='/^([A-Za-z- ]+) on ([0-9]{4} [0-9]{3} [0-9]{3}) or ([0-9]{4} [0-9]{5}) , ([A-Za-z- ]+) on ([0-9]{4} [0-9]{3} [0-9]{3}) or/';
$s1="Foo Bar-Baz on 0412 555 555 or 9555 55555 , Do Rae Me on 0555 555 555 or";
$m1=array();
$n1=preg_match($p1,$s1,$m1);
echo "PATTERN 1:  Mobile and Landline provided\n";
echo "Name 1: ".$m1[P1_NAME_1]."\n";
echo "Mobile 1: ".$m1[P1_MOBILE_1]."\n";
echo "Landline 1: ".$m1[P1_LANDLINE_1]."\n";
echo "Name 2: ".$m1[P1_NAME_2]."\n";
echo "Mobile 2: ".$m1[P1_MOBILE_2]."\n";
echo "\n";


// FirstName1 Surname1 on 0412 555 555 ,  FirstName2 Surname2 on 0555 555 555 or
define('P2_NAME_1',1);
define('P2_MOBILE_1',2);
define('P2_NAME_2',3);
define('P2_MOBILE_2',4);

$p2='/^([A-Za-z- ]+) on ([0-9]{4} [0-9]{3} [0-9]{3}) , ([A-Za-z- ]+) on ([0-9]{4} [0-9]{3} [0-9]{3}) or/';
$s2="Foo Bar-Baz on 0412 555 555 , Do Rae Me on 0555 555 555 or";
$m2=array();
$n2=preg_match($p2,$s2,$m2);
echo "PATTERN 2:  Mobile only provided\n";
echo "Name 1: ".$m2[P2_NAME_1]."\n";
echo "Mobile 1: ".$m2[P2_MOBILE_1]."\n";
echo "Name 2: ".$m2[P2_NAME_2]."\n";
echo "Mobile 2: ".$m2[P2_MOBILE_2]."\n";
?>

Вам нужно будет адаптировать классы символов, используемые для полей имени, к включению всех возможных / разрешенных разрешенных символов. Телефонные номера немного более предсказуемы, хотя следите за вариациями пробелов, пробелов и дефисов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...