1. PHP / Говнокод #3936

    +162

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    function SplitStr($V){
                      $ab=explode(' ',$V);
                      $V='';
                      foreach($ab as $a){
                            $a=substr($a,0,50).' '.substr($a,50,50).' '.substr($a,100,50).' '.substr($a,150,50).' '.substr($a,200,50).' '.substr($a,250,50).' '.substr($a,300,50).' '.substr($a,350,50);
                            $V.=$a.' ';
                      }
                      while(strpos($V, "  ")){
                            $V = str_replace("  ", " ", $V);
                      }
    
                    return $V;
    }

    Регулярные выражения? Это что и зачем?

    Запостил: mihaild, 11 Августа 2010

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

    • while(strpos($V, " ")){
      $V = str_replace(" ", " ", $V);
      }

      Удивительно что автор в данном куске не реализовал заново strpos и str_replace =)
      Было бы крутое месиво из циклов.
      Ответить
    • регэкспы тут не нужны тем более что говнокод знает примеры чудовищного их использования.
      строка 5 - заменяется обычным фором, например

      это ИМХО нормальный код - и тому есть причины
      while(strpos($V, " ")){
      $V = str_replace(" ", " ", $V);
      }
      Ответить
      • preg_replace("/(\S{50})/", "\${1} ", $string); - чудовищное использование?
        Ответить
        • на мой взгляд регулярки имеют 2 недостатка
          1. скорость ниже
          2. неочевидны с первого взгяда

          Вывод: там где можно просто обойтись без регулярки - лучше так и сделать.
          >>>чудовищное использование
          постились на данном ресурсе коды одного автора, который все делал через регэкспы 0_o. я имел ввиду их.
          Ответить
          • >>1. скорость ниже
            Вы когда нибудь видели PHP приложение, которое тормозит изза регулярок?

            >>2. неочевидны с первого взгяда
            Кому как. Тем, кто читал "mastering regular expressions" -- все совершенно очевидно.
            Ответить
            • >>>Вы когда нибудь видели PHP приложение, которое тормозит изза регулярок?
              тут важно не что где тормозит, а вопрос скорости
              Что быстрей регулярки или строковые функции?
              Вот например когда регэксп компилированый, то он может оказатся быстрее.
              Ответить
              • Программы на PHP вообще работают медленее, чем например написанный на С модуль апача.

                Но простота кода , легкость написания и маленький размер программы чаще важнее..

                Мне трудно представить себе задачу на php, где скорость регулярки была бы узким местом.

                Узкое место это такое место, которое занимает более 20% времени выполнения.

                Оптимизировать нужно только это место.

                Иными словами -- нельзя говорить что что-то тормозит, если оно занимает например 2% времени выполнения.
                Ответить
                • епта, я ж не спорю о нужности регэксов.
                  Я говорю о том, что в простых случаях, без регэкспов можно обойтись.

                  >>>Но простота кода , легкость написания
                  занчит такое крайне трудно и весьма непросто написать ))
                  for(i=0;i<351;i+=50)
                  $b.=substr($a,i,50).' '

                  и спрашиваю - "Что быстрей регэкс или строковые функции?" возможно их использование в таких случаях имеет смысл
                  Ответить
                  • Да. Одна простая строка лучше, чем цикл.
                    Ответить
                  • Во-первых, регэксп в данном случае быстрее в полтора раза (возможно, это вызвано положением звезд на небе - глубоким тестированием заниматься лень).
                    Во-вторых, мне кажется, что регэксп проще чем explode с последующим циклом.
                    Ответить
                    • >>Одна простая строка лучше, чем цикл.
                      0_о - цикл сложен в написании?
                      preg_replace("/(\S{{$len}})/", "\${1} ",$string);
                      for(i=0;i<351;i+=len)$b.=substr($a,i,len ).' ';
                      Кэп подсказывает, что цикл короче
                      Ответить
                      • Кэп подсказывает, что Вы забыли перенос строки (лепить два оператора в одну строку нехорошо).
                        Кроме того, кэп подсказывает, что Вы забыли strsplit.
                        Ответить
                        • >>>лепить два оператора в одну строку нехорошо
                          это для наглядности
                          да забыл. если регэксп быстрее имеет смысл использовать его.
                          выходит пых имеет настолько говеные строковые ф-ции, что их уделывают регэкспы?

                          >>>Мне трудно представить себе задачу на php, где скорость регулярки была бы узким местом.>>>Узкое место это такое место, которое занимает более 20% времени выполнения.
                          рекомендую заглянуть сюда
                          http://swtch.com/~rsc/regexp/regexp1.html
                          перед
                          экспоненциальной сложностью ниче не устоит MWA-HA-HA
                          Ответить
          • >>>1. скорость ниже
            или в пыхе регэксп быстрее substr?
            Ответить
          • 1. У меня regexp работает быстрее (на этом примере).
            Возможно, дел в каких-то оптимизациях в PHP.
            2. По-моему, гораздо очевидней. Тот, кто пишет на этом языке ИМХО должен знать регэкспы хотя бы на базовом уровне.
            Ответить
            • Есть специальная функция предназначенная для конкретной задачи, так зачем строить велосипед? К тому же шанс запутаться в регулярном выражении много выше, чем в функции.

              Вот чем вам обычный фор не угодил. надо будет поставить вместо 50 - переменную - регулярка засрется еще больше.
              а когда понадобится еще что-нить делать в цикле - вы потрете регулярку и напишите фор.
              Ответить
              • Не понадобится. Тут нужна именно разбивка слов больше чем из 50 символов.
                preg_replace("/(\S{{$length}})/", "\${1} ", $string); - вот с переменной длиной
                Есть, и эта функция - preg_replace :)
                Ответить
          • Есть третий недостаток: регулярки имеют ограничение на 64к входящих данных. Столкнулся с этим в cms и написании плагинов под эту cms. Как раз сейчас надо думать, как без регулярок большой текст разбить на куски, подсчитать их количество и так далее.
            Ответить
            • Если у Вас текст > 64k, то логично наверное делать state machine
              Ответить
              • И что сиё есть применительно к php? По быстрому сейчас нашёл только какие-то левые библиотеки и модель программирования такого плана Я скорее воспринимаю фразу о "State Machine", как фразу о том, что программу необходимо разбивать на объекты, каждый из которых хранит своё состояние.
                И как оно может заменить регулярки или включить их для >64k — я что-то не вижу.
                Ответить
                • Вот Вам немного теории:
                  http://en.wikipedia.org/wiki/Lexical_analysis

                  Впринципе, регулярки внутри тоже конечные автоматы.

                  PHP не лучший язык для написания такого, но тоже можно.
                  Ответить
                  • За теорию спасибо. Несколько соображений.
                    0. Упирается в регулярные выражения, об ограничениях которых выше.
                    1. К обсуждаемому вопросу имеет слабое отношение. Примерно такое: теория описывает, что нужно сделать, а спор о регулярках супротив велосипедов — как.
                    2. Лично мне в простой задаче сделать несколько замен и подсчитать их количество — малость излишня. Я ж не компилятор пишу, а простой плагин разбивки большого текста на страницы.
                    Ответить
                    • причем тут регулярные выражения?

                      Вы просили объяснить -- какое отношение конечные автоматы имеют к работе с текстом -- я привел ссылку.

                      Если Вам надо разбить слова и посчитать их кол-во, то машина может идти по тексту, увеличивая счетчик каждый раз, когда кончается слово, или сохранять это слово в массив, если оно ему нужно итд
                      Ответить
                      • 1. Я сказал об ограничениях регулярок.
                        2. Мне сказали о state machine.
                        3. Я спросил, что это...
                        И далее по тексту.

                        Хорошо, я понял, мне подкинули полезную теорию не по теме топика. А минуснули вообще от фонаря.
                        Ответить
                        • А, я понял. Вы думали что state machine спасет от ограничений регулярок?

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

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