2010-10-08 44 views
0

J'essaie de programmer un script php de messagerie électronique qui prendrait un rapport de mise à jour du trafic entrant par e-mail et extrairait les informations pertinentes pour les stocker dans une base de données.Impossible d'obtenir les résultats souhaités via preg_match_all

L'e-mail commence généralement par une introduction, avec les informations importantes affichées dans le format suivant.

Highway : Some Highway 
Time : 08-Oct-2010 08:10 AM 
Condition : Smooth (or slow moving etc) 

J'ai essayé avec ce code

preg_match_all('/(?P<\name>\w+) : (?P<\data>\w+)/i', $subject, $result);

Notez le </sont vraiment juste < mais en quelque sorte, ils ne sont pas affichés ici.

Et les matches sont seulement:

Highway : Some 
Datetime : 08 
Condition : Smooth 

Quelqu'un peut-il me dire ce qui manque dans ma deuxième expression regex? Pourquoi n'inclut-il pas toute la chaîne de mots après le ":"?

Répondre

1

Vous capturez \w+. Cela ne correspond qu'aux caractères de mot, ceci n'inclut pas les espaces ou les parenthèses.

Essayez

preg_match_all('/(?P<name>\w+)\s*:\s*(?P<data>.*)/i', $subject, $result); 

essayez d'utiliser .*? Cela correspond tout au nouveau caractère de ligne

+0

Merci beaucoup Galen! Puis-je savoir ce que * fait exactement? – blacklotus

+0

@blacklotus: L'étoile Kleene ('*') dans une expression régulière signifie zéro ou plusieurs répétitions de quelque chose. Dans cette réponse, '\ s *' signifie zéro ou plusieurs caractères d'espacement. La partie zéro est importante, puisque quelque chose comme 'ab * a' correspond' aba' et 'abbbb' mais * aussi' 'aa'. – eldarerathis

+0

@eldarerathis Merci! – blacklotus