从字符串中解析名称和电话号码

时间:2011-05-24 02:00:37

标签: php regex string

我必须将纯文本订单表单(我无法控制)转换为单独的数据库字段。

作为其中的一部分,我在订单的这一部分得到2个变体,我需要名称,移动(单元格)和固定电话(如果提供)。文字如下:

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 

(请注意,最后的'或'不是错误,就是它的收到方式。)

处理此问题的最佳方法是什么?用逗号爆炸,然后用'或'爆炸,看是否有超过1部电话?

正则表达不是我的力量因此爆炸的建议,但建议愉快。

...谢谢

2 个答案:

答案 0 :(得分:0)

这是一个使用正则表达式子模式的脚本,用于您需要的字段:

<?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";
?>

您需要调整用于名称字段的字符类,以包含允许的所有可能/合法字符。电话号码更容易预测,但要注意空格,空格和连字符的变化。

答案 1 :(得分:0)

我会像这样使用爆炸和分裂:

$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 :
相关问题