GOOGLE ADS

понедельник, 11 апреля 2022 г.

Выражение времени в формате номеров пэдов, имеющее переменные разделители с ведущими нулями

Каков наилучший способ сформировать строку в определенном формате, например, в excel (##, # и т. д.)?

Я хочу установить формат 00:00.00, если кто-то поставит 1:10.10, я хочу добавить ноль перед ними. Если вход выглядит как 1.5.07, он должен быть преобразован в 01:50.07, более сложный вариант: 0.3 должен быть преобразован в 00:00.30.

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

$input = "00:13,40";
echo preg_replace("/(d){2}:(d){2}\.(d){2}/","???",$input);

, на входе должен быть преобразован в точку. Ввод может быть любым, например 13.40, и должен быть преобразован в 00:13.40. Он должен заменить неправильный разделитель и добавить отсутствующий 0 в начале или в конце ( 0:13.4 )


Решение проблемы

Я не знаю, достаточно ли у меня тестовой батареи из деталей вашего вопроса, но следующий метод исправит добавление нуля в строки, которые вы предоставили.

Шаблон эффективно анализирует строку с двумя необязательными наборами чисел, а затем требуемым числом перед концом строки.

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

Я добавил отрицательное опережение ( (?!\d+$)), чтобы число, состоящее только из двух наборов чисел, не использовало первый набор в качестве часов (первое число в результате).

sprintf()— это элегантный способ принудительного применения формата, дополненного нулями, в каждой группе замещающей строки.

Код: ( Демо )

$tests = [
'1:10.10',
'1.5.07',
'0.3',
'00:13,40',
'15,17',
];
var_export(
preg_replace_callback(
'~(?:(\d{1,2})[:.,](?!\d+$))?(?:(\d{1,2})[:.,])?(\d{1,2})$~',
function($m) {
return sprintf('%02d:%02d.%02d', $m[1], $m[2], $m[3]);
},
$tests
)
);

Выход:

array (
0 => '01:10.10',
1 => '01:05.07',
2 => '00:00.03',
3 => '00:13.40',
4 => '00:15.17',
)

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

Код: ( Демо )

preg_replace_callback(
'~(?:(\d+)\D+)??(?:(\d+)\D+)?(\d+)$~',
function($m) {
unset($m[0]);
return vsprintf('%02d:%02d.%02d', $m);
},
$tests
)

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...