LINUX.ORG.RU
решено ФорумTalks

[PHP] разберите код по косточкам. плиз.

 


0

1

Нашёл в нете тестовое задание на PHP шника:

«Напишите php-функцию, которая получает строку вида „5 мин. 35 сек.“, а возвращает строку вида „minutes: 05; seconds: 35“.»

Сделал:

<?php

   function format_my_time($time_r) {
      $t = array();

      if (mb_ereg_match ("[0-9]+[\s]?[а-яА-Я.]{4}\s+[0-9]+[\s]?[а-яА-Я.]{4}", $time_r)) {
              $t = preg_split("/ /",$time_r);
              if ($t[0] <= 9)              
                      $t[0] = '0'.$t[0];
                          
              $res = 'minutes: '.$t[0].'; seconds: '.$t[2];
      }
      else 
      {
              $res = 'Неправильно ввели время.';
      }
     return $res;
   }

   $time_str = '5 мин. 36 сек.';
   $result_string = format_my_time ($time_str);
?>
<?php echo $result_string; ?>

Что так? Что не так? Есть го*нокод в коде?

★★★★★

Последнее исправление: sniper21 (всего исправлений: 3)

Ответ на: комментарий от timur_dav

Что не так? Неужели preg_replace надо было применить?

sniper21 ★★★★★
() автор топика

Регэксп слишком жирный. Достаточно будет цифр и пробелов.

Забыл секундым ноль подрисовывать.

daris
()
Ответ на: комментарий от daris

точно.

Финальная версия:

<?php

   function format_my_time($time_r) {
      $t = array();

      if (mb_ereg_match ("[0-9]+[\s]?\\мин.\s+[0-9]+[\s]?\\сек.", $time_r)) {
              $t = preg_split("/ /",$time_r);
              if ($t[0] <= 9)              
                      $t[0] = '0'.$t[0];
              if ($t[2] <= 9)              
                      $t[2] = '0'.$t[2];            
              $res = 'minutes: '.$t[0].'; seconds: '.$t[2];
      }
      else 
      {
              $res = 'Неправильно ввели время.';
      }
     return $res;
   }

   $time_str = '5 мин. 6 сек.';
   $result_string = format_my_time ($time_str);
?>
<?php echo $result_string; ?>

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Можно и вообще без регекспов обойтись. Мой пример на perl:

use warnings;
use strict;
use 5.010;

sub func {
	sprintf("minutes: %02d; seconds: %02d",(split(/ /,$_[0]))[0,2]);
}

say func("5 мин. 35 сек.");
#minutes: 05; seconds: 35

joy4eg ★★★★★
()

[troll mode] Мой пример на c++

//получение строки
if (str=="5 мин. 35 сек.")
{
 cout<<"minutes: 05; seconds: 35";
}
//....

[/troll mode]

ymuv ★★★★
()

Есть го*нокод в коде?

Есть. Но не беспокойся, это не твоя вина. Постановка задачи просто не предполагает решения без говнокода 8).

Deleted
()
Ответ на: комментарий от ymuv

troll mode

И зачем тебе выделение блока фигурными скобочками?

KRoN73 ★★★★★
()
Ответ на: комментарий от Xellos

По условию задачи, там пробел, в любом случае, можно сделать split(/\s+/,...)

joy4eg ★★★★★
()

Эта функция - ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.

пример глюка - http://webew.ru/posts/1836.webew

почему нельзя было юзать старые добрые PCRE?

использование preg_split в данном случае несколько подозрительно.

drBatty ★★
()

intval() же можно использовать.

lllnk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.