2013-06-25 3 views
4

je besoin de lire les champs de cette emailEmail lu en PHP

MOVE INFORMATION 

Pickup Address: 34 Marigold Ln, Marlboro, NJ 07746 

Delivery Address: 180 Prospect Park W, Apt 5, Brooklyn, NY 11215 

Primary service dates: 
Pack Date: N/A 
Move Date: 6/6/2013 

Other service dates: 
Pack Date 2: N/A 
Move Date2: N/A 
Other Date: N/A 

Le processus Je suivais est:

  1. Se connecter via IMAP
  2. obtenir le corps nessage

Maintenant, je veux lire les données spécifiées et besoin de le convertir en tableau comme:

array(' Pickup Address'=>'34 Marigold Ln, Marlboro, NJ 07746', 
     'Delivery Address'=>'180 Prospect Park W, Apt 5, Brooklyn, NY 11215'...) 

J'ai essayé preg_match('/(?P<Pickup Address>\w+): (?P<Delivery Address>\d+)/', $body, $matches)

mais c'est d'avoir un problème:

  1. Il n'accepte pas dans l'espace 'Adresse de ramassage'
  2. il fournit en format tableau Array ([0] => Address: 34 [PickupAddress] => Address [1] => Address [DeliveryAddress] => 34 [2] => 34).

Fondamentalement, je dois enregistrer ces champs dans la base de données et je ne peux pas utiliser de pièce jointe ici. Faites-moi savoir si vous avez une autre solution ou un moyen de le faire fonctionner

+0

ordre et le format sera même à chaque fois? signifie d'abord adresse Pickup puis adresse de livraison et ainsi de suite? –

+0

Oui! Le nom des champs resterait le même que leurs valeurs varieraient – Jacklish

Répondre

5

Quelque chose comme ça?

$string = 'MOVE INFORMATION 

Pickup Address: 34 Marigold Ln, Marlboro, NJ 07746 

Delivery Address: 180 Prospect Park W, Apt 5, Brooklyn, NY 11215 

Primary service dates: 
Pack Date: N/A 
Move Date: 6/6/2013 

Other service dates: 
Pack Date 2: N/A 
Move Date2: N/A 
Other Date: N/A'; 

preg_match_all('#(.*?):(.*)#m', $string, $m); 
if(isset($m[1], $m[2])){ 
    $array = array_combine($m[1], $m[2]); 
    print_r($array); 
} 

Sortie:

Array 
(
    [Pickup Address] => 34 Marigold Ln, Marlboro, NJ 07746 
    [Delivery Address] => 180 Prospect Park W, Apt 5, Brooklyn, NY 11215 
    [Primary service dates] => 
    [Pack Date] => N/A 
    [Move Date] => 6/6/2013 
    [Other service dates] => 
    [Pack Date 2] => N/A 
    [Move Date2] => N/A 
    [Other Date] => N/A 
) 
+0

Et si les bonnes valeurs ont aussi le caractère ":", est-ce que ça va le gérer? –

+0

Like Pickup Adresse: 34 Marigold Ln, Marlboro: NJ 07746 –

+1

@IrfanDANISH [Oui ce sera] (http://regex101.com/r/oB4gA3) – HamZa

0

Vous pouvez utiliser le code comme ceci:

preg_match_all("/(Pickup Address|Delivery Address): *(.*)/", $email, $match); 
$result = array(); 
foreach($match[1] as $i => $key) { 
    $result[$key] = $match[2][$i]; 
} 
print_r($result); 

si vous voulez plus de champs les ajouter juste à regex.

2

Vous semblez avoir choisi une solution alors que vous avez du mal à la faire correspondre au problème. Oui, vous pouvez utiliser des regex - mais vous allez devoir définir le problème beaucoup mieux que vous avez déjà. Que faire si une ligne contient plus d'un ':'? Qu'en est-il des lignes blanches? Que se passe-t-il si un élément de données s'étend sur plus d'une ligne (ce qu'il pourrait faire en fonction de la façon dont l'email est encodé)?

Pendant que vous pouvez utiliser un YAML parser, il est probablement exagéré pour une mise en page simple:

$data=array(); 
while ($line=fgets($file_handle)) { 
    $key=trim(substr($line, 0, strpos($line, ':'))); 
    $value=trim(substr($line, strpos($line, ':')+1)); 
    if ($key && $value) $data[$key]=$value; 
} 
+0

J'aime ça, les gens ont tendance à penser que regex est la solution à tout. – HamZa