我必须将纯文本订单表单(我无法控制)转换为单独的数据库字段。
作为其中的一部分,我在订单的这一部分得到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部电话?
正则表达不是我的力量因此爆炸的建议,但建议愉快。
...谢谢
答案 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 :