2009-11-10 7 views
0

J'ai un site Web où j'ai besoin d'analyser les chaînes de date/heure à partir de reçus. Ceux-ci peuvent être dans une variété de différents formats - par exemple, une chaîne pourrait être '11/04/2009 12:46 PM ', tandis qu'un autre pourrait être' Mar06'09 10:57 AM '. J'ai besoin d'une chaîne de date/heure standard pour faire une insertion de base de données.transformation de chaîne simple?

Je voudrais éviter d'écrire du nouveau code php pour chaque client pour analyser leur chaîne. Quelque chose que je fais ailleurs est stocker une expression régulière dans un champ de base de données - de cette façon, afin de valider les données, je peux faire

<?php 

if (! preg_match($row['regex'], $variable_user_input)) { ... } 

?> 

Donc, si je dois ajouter un client qui a un critère de validation différents, Je dois juste écrire une nouvelle regex, qui va dans l'enregistrement de la base de données client, au lieu d'écrire, de tester et de déployer un nouveau code php sur le site web. C'est un système plus robuste.

Existe-t-il quelque chose comme une expression régulière, quand je peux entrer une chaîne, entrer une autre chaîne de transformation et obtenir ma date-heure en sortie?

Répondre

2

vous pouvez utiliser des sous-groupes nommés dans vos expressions régulières pour découpler l'analyseur de formats concrets

function parse_date($date, $regexps) { 
    foreach($regexps as $re) 
     if(preg_match($re, $date, $m)) 
      return strtotime("{$m['year']}-{$m['month']}-{$m['day']} {$m['time']}"); 
} 


$formats = array(
    "~(?P<month>[a-z]+)(?P<day>\d\d)'(?P<year>\d\d) +(?P<time>[\d:APM]+)~i", 
    "~(?P<month>\d\d)/(?P<day>\d\d)/(?P<year>\d\d\d?\d?) +(?P<time>[\d:APM]+)~i" 
); 


echo date("d m Y H i", parse_date("Mar06'09 10:57AM", $formats)); 
echo date("d m Y H i", parse_date('11/04/2009 12:46PM', $formats)); 

// modifier

modèles nommés sont assez peu documentés, cela est tout ce que je pourrait trouver

Il est possible de nommer le sous-masque avec (? Ppattern) depuis PHP 4.3.3. Le tableau avec les correspondances contiendra la correspondance indexée par la chaîne à côté du match indexé par un nombre, alors.

http://www.php.net/manual/en/regexp.reference.subpatterns.php

+0

Merci, stereofrog! Pouvez-vous me montrer un tutoriel pour les sous-groupes nommés? Une recherche google ne se présente pas beaucoup - seulement des références sur des listes de diffusion. – user151841

2

Cela ne gère pas la partie regex, mais je parie que strtotime entrera en jeu à un moment donné dans le processus.