"PHP" / Говнокод #4033 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
// get extension and name
        $ar = explode('.', $result['name']);
        if (count($ar) == 2)
        {
            $fName = $ar[0];
            $fExt  = $ar[1];
        }
        elseif (count($ar) < 2)
        {
                $fName = $result['name'];
                $fExt  = '';
        }
        else 
        {
                    $fName = $ar[0];
                    for ($i = 1; $i < count($ar); $i++)
                    {
                        $fName .= '.' . $ar[$i];
                    }
                    $fExt = $ar[count($ar) - 1];
        }

Вот таким вот образом в проекте вычисляется расширение файла

PS. Для тех кто в танке:
method1(using internal function):
$extension = pathinfo($filename, PATHINFO_EXTENSION);
method2(coder know about 'explode' function)
$ar = explode(".", $filename); $extension = count($ar)>1 ? end($ar) : "";
method3(coder know about 'strchr', 'strrchr' and 'substr' functions)
$extension = strrchr(".", $filename ) == FALSE ? "" : substr(strrchr(".", $filename));

Запостил: mykola mykola, (Updated )

Комментарии (22) RSS

  • а какой метод предпочтительней? наверное 3. хотя я обычно решал 2ым
    Ответить
    • вот так люра показал что он пыхозадрот и школомакака, а выебывается
      Ответить
    • дааааа уж, а надо первым методом пользоваться
      P.S. а вообще затея вычислением расширения по-моему лишняя, где оно пригодиться то может..
      Ответить
      • угу, век живи, пыхозадротом от рождения был и помрешь

        ну например проверка при загрузке на определенные расширения файлов
        Ответить
        • тащемто расширения файлов имеют магическое значение только в мире дос/виндоус.

          для юниксоидов это просто кусочек имени, так что серьезно что-то фильтровать по расширению -- глупо имхо
          Ответить
          • надо и по расширению, и по миме-типу.
            Потому что, если мы зауплоудим, скажем, гифку, но без расширения - какой контент-тип тогда слать броузеру, отдавая ее?
            если я что-то не понимаю, пожалуйста, просветите
            Ответить
            • от браузера зависит, думаю что x-application какой-нить пошлет.

              мы же на своей стороне может проверить ее заголовок
              например гифы начинаются как GIF89, зипы как PK итд

              ну для надежности можно и расширение конечно
              Ответить
              • я уже говорю о том случае, по какому миме сервак будет отдавать такой невнятный файл

                ну этим может заняться и fileinfo

                для надежности. Потому что на вход и броузер может отослать какой угодно миме. Тот же image/pjpeg
                Ответить
    • Это ж надо было выбрать ВСЁ кроме того, что нужно. Имхо, случайно такую глупость сморозить довольно таки сложно.

      Сортировать одномерный массив пузырьком будете, а считывать содержимое файла в строку - в цикле?
      Ответить
  • В методе 3 есть копипаст, который зло. И substr() там неправильно вызвана. Самое короткое, пожалуй, будет
    $extension = substr((string) strrchr('.', $filename), 1);

    И да, забыли метод 4 - для поклонников регэкспов:
    $extension = preg_match('/\.([^.]+)$/', $filename, $matches) ? $matches[1] : '';
    Ответить
    • копипаст всегда зло, я про сам подход

      а скорость сейчас замерим...
      Ответить
      • <продолжение>
        ... а замеры показывают, что pathinfo зря я не использовал - она даже быстрее (30 микросекунд) выражений со строковыми функциями. а метод (2) с разделением строки на массив - как и ожидалось, наиболее медленный - 90 микросекунд. метод 3 - 80 микросекунд
        Ответить
          • факты, просто убедиться.
            вообще я думал, что pathinfo лезет в сам файл, потому будет медленен
            Ответить
            • >>факты, просто убедиться

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

              господа, пора сливать долбоеба макаку, походу это второй вебкилл детектед
              Ответить
  • про metod3 я прогнал, прошу прощения. Почему то думал что strrchr возвращает позицию символа, а эта хрень возвращает подстроку. Правильный вариант
    $extension = substr((string) strrchr($filename, '.'), 1);

    Я заморочился и замерял скорость, мои результаты несколько иные:
    Results: 
    Test #1 duration: 3.017 result: xml name: preg_match
    Test #2 duration: 1.324 result: xml name: strrchr
    Test #3 duration: 1.34 result: xml   name: strrchr2
    Test #4 duration: 1.905 result: xml name: explode
    Test #5 duration: 2.301 result: xml name: pathinfo

    Тестовая строка 'nbpro.ject/pri.vate/private.xml'.

    Суть не в производительности, но читаемости. pathinfo все же имхо наиболее легко воспринимается.
    Ответить
    • Результаты теста preg_match() можно сразу выкидывать. При многократном повторении вызова регулярки в цикле затраты на её однократную компиляцию становятся незаметны, в реальном же приложении они бы сыграли бОльшую роль за счёт на порядки меньшего числа вызовов.
      Ответить
      • э. Я где то писал что "многократно вызывал регулярку"? Вроде не заметил. Каждый тест выполнялся ровно 1 раз. Цифры - какие то милимикросекунды. Я могу выложить сгенерированый тест.
        Ответить
        • зы. понял что неправильно понял :). Да, действительно результаты теста можно выкинуть. Пофих.
          Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8