2011-05-24 2 views
1

Je dois convertir des formulaires de commande de texte brut (sur lesquels je n'ai aucun contrôle) en champs de base de données individuels.Nom de l'analyse et numéros de téléphone de la chaîne

Dans ce cadre, j'obtiens 2 variations sur cette partie de la commande, pour laquelle j'ai besoin du nom, mobile (cellulaire), et fixe (si fourni). Le texte vient comme ceci:

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

ou il peut venir avec seulement mobile (cellulaire) pour 1 d'entre eux comme

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

(NOTE que la finale « ou » n'est pas une erreur, c'est comme ça que ça a été reçu).

Quelle est la meilleure façon de gérer cela? Exploser par la virgule, puis exploser par 'ou' pour voir s'il y a plus d'un téléphone? Regex n'est pas ma force donc exploser suggestion, mais suggestions heureusement prises.

Merci ...

Répondre

0

j'utiliser exploser et fendu comme ceci:

$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"; 
    } 
} 

sortie:

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

Je pense que j'aime mieux cette solution que l'expression rationnelle ordinaire car cela signifie seulement 1 passage pour traiter les différentes combinaisons plutôt que de multiples modèles de recherche. – niggles

0

Voici un script en utilisant des sous-modèles regex pour les champs dont vous avez besoin:

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

Vous devrez adapter les classes de caractères utilisés pour les champs de nom pour inclure tout possible/légal caractères autorisés. Les numéros de téléphone sont un peu plus prévisibles, mais attention aux variations sur les espaces, pas d'espaces, et les traits d'union.

+0

donc j'ai vraiment besoin de faire des passes multiples pour assurer je capture toutes les possibilités (que je viens de découvrir out inclut également une autre variation). Je pense qu'un mélange d'exploser en utilisant ',' comme délimiteur et votre regex le résoudrait car bien qu'il y ait des variations sur les motifs, ils ne sont PAS un texte d'entrée libre et suivent un format. – niggles

Questions connexes