Регулярное выражение PHP для извлечения метки времени и комментариев - PullRequest
3 голосов
/ 21 июня 2010

У меня есть несколько экспортированных текстовых полей из старой базы данных доступа, которые переносятся в новую структуру mysql. Существуют различные поля ввода в формате:

10.06.2010 09:10:40 Работа еще не началась

Я хотел бы взять эту строку и использовать какое-то регулярное выражение для извлечения информации о дате / времени, а затем комментария.

Существует ли простой синтаксис регулярного выражения для сопоставления этой информации?

Спасибо

Ответы [ 9 ]

7 голосов
/ 21 июня 2010

Вы можете использовать это вместо регулярного выражения:

$parts = explode(" ", $string, 3);
3 голосов
/ 21 июня 2010

Я думаю, я пойду на это

preg_match('|^([0-9]{2})/([0-9]{2})/([0-9]{4})\s([0-9]{2}):([0-9]{2}):([0-9]{2})\s(.*)$|',$str,$matches);
list($str,$d,$m,$y,$h,$m,$s,$comment)=$matches;

тогда у вас есть необходимые значения для восстановления времени в любом формате, который вы пожелаете.

3 голосов
/ 21 июня 2010

На мой взгляд, вы можете просто использовать существующие пробелы в качестве разделителей, получая следующее выражение:

/([^ ]+) ([^ ]+) (.+)/

То есть: три группы, разделенные пробелами, из которых первые две группы не содержат пробелов (но третья может).

2 голосов
/ 21 июня 2010

В данных условиях регулярное выражение стоит дорого .Если этот формат всегда гарантирован, вы можете разделить его на 2 пробела и использовать первые 2 фрагмента следующим образом:

$str = "10/06/2010 09:10:40 Work not yet started";
$slices = explode(" ", $str, 3);
$timestamp = strtotime($slices[0] . $slices[1]);
echo "String is $str\n";
echo "Timestamp is $timestamp\n";
echo "Timestamp to date is " . strftime("%d.%m.%Y %T", $timestamp) . "\n";
1 голос
/ 21 июня 2010

Ну, если ваша дата / время хранится как тип datetime, то вы можете использовать что-то вроде

preg_match("/^([0-9\\/]{10} [0-9:]{8}) (.*)$/",$str,$matches);
$datetime = $matches[1];
$description = $matches[2];

Если вы храните дату / время отдельно, вы можете использовать

preg_match("/^([0-9\\/]{10}) ([0-9:]{8}) (.*)$/",$str,$matches);
$date = $matches[1];
$time = $matches[2];
$description = $matches[3];

Конечно, альтернативой регулярным выражениям является разнесение строки:

list($date,$time,$description) = explode(' ',$str,3);

И еще один вариант, предполагая, что даты и время всегда имеют одинаковую длину:

$date = substr($str,0,10);
$time = substr($str,11,19);
$description = substr($str,20);
0 голосов
/ 21 июня 2010
$s = '10/06/2010 09:10:40 Work not yet started';
$date = substr($s, 0, 19);
$msg = substr($s, 20);

$date = strtotime($date);
// or
$date = strptime($date, "%m/%d/%Y %H:%M:%S");
0 голосов
/ 21 июня 2010

Вы можете извлечь информацию с помощью приведенного ниже кода:

// sample string you provided
$string = "10/06/2010 09:10:40 Work not yet started";

// regular expression to use
$regex = "/^(\d+)\/(\d+)\/(\d+) (\d+)\:(\d+)\:(\d+) (.+?)$/";

Теперь все необходимые поля находятся в массиве $ match.Чтобы извлечь информацию в массив $ match, вы можете использовать preg_match ()

// method 1: just extract
preg_match($regex, $string, $matches);

// method 2: to check if the string matches the format you provided first
//           then do something with the extracted text
if (preg_match($regex, $string, $matches) > 0) {
   // do something
}

Для дальнейшего использования полученной информации:

// to get a Unix timestamp out of the matches
// you may use mktime()

// method 1: supposed your date format above is dd/mm/yyyy
$timestamp = mktime($matches[4], $matches[5], $matches[6], 
  $matches[2], $matches[1], $matches[3]);

// method 2: or if your date format above is mm/dd/yyyy
$timestamp = mktime($matches[4], $matches[5], $matches[6], 
  $matches[1], $matches[2], $matches[3]);

Тогда вы можете посмотретьвремя правильно проанализировано:

print date('r', $timestamp)

Наконец, получите комментарий следующим образом:

$comment = $matches[7];

Помните о проблеме с часовым поясом.Если вы анализируете эти данные на том же сервере, что и они, вам, скорее всего, все будет хорошо.Возможно, вам придется добавить / вычесть время из отметки времени выше.

0 голосов
/ 21 июня 2010

Если вы просто хотите извлечь его из 2 строк, вы можете использовать:

([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})\s(.*)
0 голосов
/ 21 июня 2010
if(preg_match('([0-9/]+ [0-9:]+)', $myString, $regs)) {
  $myTime = strtotime($regs[1]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...