@danforth

Как сделать регулярное выражение с запоминанием но исключить часть?

Всем привет!

https://regex101.com/r/FnawtN/1

Если вкратце, то, есть варианты строк в которых указаны дни, часы, и минуты (длительность):
5 д. 1 ч. 23 м.
17 ч. 44 м.
12 д. 17 ч.

На выходе (для 1-го варианта) хочу получить массив со значениями:
[
    'days' => 5,
    'hours' => 1,
    'minutes' => 23,
]


Чтобы каждая группа была названа, если не указаны минуты - пусть не будет такого ключа в массиве.
Можно ли сделать так, чтобы пустых значений в массиве не было? Если открыть ссылку в самом начале вопроса, видно что много пустых Full Match попадается.

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

Спасибо!
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 1
gobananas
@gobananas
finishhim.ru
Можно ли сделать так, чтобы пустых значений в массиве не было?

Можно, но наверное придётся проверять каждое значение по отдельности регулярками по отдельности
https://regex101.com/r/qFflgP/1
[0-9]+[\s]{0,}д
[0-9]+[\s]{0,}ч
[0-9]+[\s]{0,}м

Если какая-то из регулярок не сработала или вернула пустое значение то ставить вручную 0
if(!preg_match('/[0-9]+[\s]{0,}д/ismu', $string)){
   $days= 0;
}

И в конце делать:
[
    'days' => $days,
    'hours' => $hours,
    'minutes' => $minutes,
]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы