PHP взорваться по дате, сохраняя разделитель - PullRequest
0 голосов
/ 26 июня 2018

Моя строка выглядит так 05/21/2018 ghijkl 06/12/2018 mnopqrst

Мне нужно извлечь все значения после каждой даты и включить дату. Я пытался

explode('/2018', $string);

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

Спасибо.

Ответы [ 5 ]

0 голосов
/ 26 июня 2018

Вы можете использовать preg_split с флагами PREG_SPLIT_DELIM_CAPTURE и PREG_SPLIT_NO_EMPTY, чтобы сохранить разделитель и удалить пустые значения из полученного массива.

Вы можете использовать шаблон, который соответствует формату даты \b\d{1,2}/\d{1,2}/\d{4}\b ( Примечание , что он соответствует вашему формату даты в данных примера и не проверяет саму дату )

Например:

$str = '05/21/2018 ghijkl 06/12/2018 mnopqrst';
$result = preg_split('@(\b\d{1,2}/\d{1,2}/\d{4}\b)@', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
var_dump($result);

Демо

Для проверки даты вы можете использовать DateTime и, возможно, указать свой формат, используя createFromFormat .

$date = DateTime::createFromFormat("m/d/Y", '05/21/2018');
0 голосов
/ 26 июня 2018

Вы можете сделать это с помощью регулярных выражений. Вот пример кода:

<?php

$string = '05/21/2018 ghijkl 06/12/2018 mnopqrst';
$matches = [];

if (preg_match_all('#(\d{2}\/\d{2}\/\d{4})#i', $string, $matches) > 0) {
  echo "Found the following dates: \n";

  foreach ($matches[0] as $date) {
    printf("- %s\n", $date);
  }
}

Это приведет к следующему выводу:

Found the following dates:
- 05/21/2018
- 06/12/2018
0 голосов
/ 26 июня 2018

Предполагая, что ваша дата гарантированно будет отформатирована так, как вы упомянули (если это вводимые пользователем данные, как правило, это небезопасно), вы можете использовать регулярное выражение для поиска строк после даты:

Использование PHP регулярного выражения с выражением ниже: /([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2,4})([a-zA-Z\s]+)/g

Будет разбивать 05/21/2018 ghijkl 10/12/2017 mnopqrst на массив с разными группами. В зависимости от того, как на самом деле вы хотите получить выходные данные, вы можете записать дату и последующую строку в одну группу совпадений.

Пример кода:

$string = '05/21/2018 ghijkl 10/12/2017 mnopqrst';
preg_split('/([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2,4})([a-zA-Z\s]+)/g', $string, $stringParts);

array (
    0 => '05/21/2018', 
    1 => 'ghijkl',
    2 => '10/12/2017',
    3 => 'mnopqrst'
);

https://regex101.com/r/gPXkDz/2

0 голосов
/ 26 июня 2018

Вы можете сделать что-то вроде этого

$str = '05/21/2018 ghijkl 10/12/2017 mnopqrst';
$arr = explode(' ',$str);
$new = array();
for($i=0;$i<count($arr);$i+=2){
  $new[] = ["date"=>$arr[$i],"value"=>$arr[$i+1]];
}
print_r($new);

Live Demo

Выход:

Array
(
    [0] => Array
        (
            [date] => 05/21/2018
            [value] => ghijkl
        )

    [1] => Array
        (
            [date] => 10/12/2017
            [value] => mnopqrst
        )

)
0 голосов
/ 26 июня 2018

Вы можете использовать current(explode('/', $string));

...