@aopil

Как изменить формат даты в строке?

Есть строка
$code = 'Laldldlldlsdls.... Ends Jul 2, 2021';
Нужно привести в формат Laldldlldlsdls.... Ends July 02, 2021

Я сделал так:
$code = 'Laldldlldlsdls.... Ends Jul 2, 2021';

if (preg_match_all('/Ends (.+)/m', $code, $matches, PREG_SET_ORDER, 0))
{
	$date = DateTime::createFromFormat('M d, Y', $matches[0][1])->format('F d, Y');

	$pattern = '/(\w+) (\d+), (\d+)/i';
	echo preg_replace($pattern, $date, $code);
}


Кажется все работает, но че-то много всего задействовано, может есть более простой вариант?)
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
$dataIn = 'Laldldlldlsdls.... Ends Jul 2, 2021';
$dataOut = preg_replace_callback(
    '/Ends (.+)/',
    fn($matches) => date('F d, Y', strtotime($matches[1])),
    $dataIn
);

Регулярку настроить по вкусу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Stalinko
PHP'шник и фрилансер до мозга костей
1. Зачем используется preg_match_all да ещё с параметром PREG_SET_ORDER если по факту используется только 1 результат? Либо у вас множество таких дат - тогда и обрабатывать их надо в цикле. Либо одна дата - тогда достаточно preg_match.

2. Зачем добавлен модификатор "m", который тут абсолютно бесполезен?

3. Почему для поиска даты у вас одна регулярка, а для замены той же самой даты - другая регулярка? При замене регулярка вообще не нужна, т.к. вы знаете конкретную строку, которую собираетесь менять. Можно пользоваться обычным str_replace если есть уверенность, что такой же строки не может быть в других местах текста. Либо как вариант в первой же регулярке захватывать весь текст до даты и тогда результатом будет "текст до даты" + "новая дата".

В целом не вижу никаких проблем в данном подходе кроме чистоты кода. Ну конечно, если алгоритм корректен для поставленной задачи.
Достаточно исправить замечания 1-3.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы