Любые изящные идеи о том, как разобрать этот набор данных? - PullRequest
3 голосов
/ 01 декабря 2010

Я использую PHP 5.3 для получения набора данных от вызова веб-службы, который возвращает информацию об одной или нескольких транзакциях.Возвращаемые значения каждой транзакции ограничены каналом (|), а начало / конец транзакции - пробелом.

2109695|49658|25446|4|NSF|2010-11-24 13:34:00Z 2110314|45276|26311|4|NSF|2010-11-24 13:34:00Z 2110311|52117|26308|4|NSF|2010-11-24 13:34:00Z (etc)

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

Ответы [ 4 ]

4 голосов
/ 01 декабря 2010

Если каждая отметка времени будет иметь Z в конце, вы можете использовать положительное утверждение просмотра за спиной, чтобы разделить пространство, только если ему предшествует Z как:

$transaction = preg_split('/(?<=Z) /',$input);

Как только вы получитетранзакции, вы можете разделить их на |, чтобы получить отдельные части.

ссылка на кодовую панель

Обратите внимание, что если ваши данные имеютZ после пробела в любом другом месте, кроме метки времени, приведенная выше логика завершится ошибкой.Чтобы преодолеть, чем вы можете разделить на пространство, только если ему предшествует шаблон отметки времени как:

$transaction = preg_split('/(?<=\d\d:\d\d:\d\dZ) /',$input);
1 голос
/ 01 декабря 2010

Как уже говорили другие, если вы точно знаете, что не будет никаких символов Z, кроме даты, вы можете просто сделать:

$records = explode('Z', $data);

Но если они у вас есть где-то в другом месте, вам нужно сделать что-то более изощренное.

$regex = '#(?<=\d{2}:\d{2}:\d{2}Z)\s#i';
$records = preg_split($regex, $data, -1, PREG_SPLIT_NO_EMPTY);

По сути, эта запись ищет часть времени (00:00:00), за которой следует Z. Затем он разделяется на следующий символ пробела ...

1 голос
/ 01 декабря 2010

Каждая временная метка будет иметь Z в конце, поэтому взорвите ее 'Z'. Вам не нужно регулярное выражение. Нет никаких шансов, что у даты будет Z после только времени.

пример

1 голос
/ 01 декабря 2010

Использование explode('|', $data) функция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...