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

    +156

    1. 1
    2. 2
    3. 3
    4. 4
    $val = trim($val);
       for ($x = 0; $x < 20; $x++) {
       $val = str_replace('  ', ' ', $val);
    }

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

    Запостил: maenwen, 17 Августа 2010

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

    • где-то я это уже видел ))
      Ответить
    • как бывалый макакокодер, предложу очаровательную замену )))
      $val = str_replace('  ', ' ', $val);
      $val = str_replace('   ', ' ', $val);
      $val = str_replace('    ', ' ', $val);
      $val = str_replace('     ', ' ', $val);
      $val = str_replace('      ', ' ', $val);
      $val = str_replace('       ', ' ', $val);
      $val = str_replace('        ', ' ', $val);
      $val = str_replace('         ', ' ', $val);
      $val = str_replace('          ', ' ', $val);
      $val = str_replace('           ', ' ', $val);
      $val = str_replace('            ', ' ', $val);
      $val = str_replace('             ', ' ', $val);
      $val = str_replace('              ', ' ', $val);
      $val = str_replace('               ', ' ', $val);
      $val = str_replace('                ', ' ', $val);
      $val = str_replace('                 ', ' ', $val);
      $val = str_replace('                  ', ' ', $val);
      $val = str_replace('                   ', ' ', $val);
      $val = str_replace('                    ', ' ', $val);
      Ответить
      • Только надо наоборот - замену от больше числа пробелов к меньшему
        Ответить
      • Нужно как в #3936
        while(strpos($V, "  ")){
            $V = str_replace("  ", " ", $V);
        }
        Ответить
        • Только не прокатит, если строка начинается с двух и более пробелов :)
          Ответить
          • Там все продумано, пробелы предварительно обрезаются)
            PS Всегда удивляло, на что только люди не пойдут, лишь бы не использовать регулярки по прямому назначению
            Ответить
            • $val = preg_replace('/\s{15}/g', ' ', $val);
              $val = preg_replace('/\s{14}/g', ' ', $val);
              $val = preg_replace('/\s{13}/g', ' ', $val);
              $val = preg_replace('/\s{12}/g', ' ', $val);
              $val = preg_replace('/\s{11}/g', ' ', $val);
              $val = preg_replace('/\s{10}/g', ' ', $val);
              $val = preg_replace('/\s{9}/g', ' ', $val);
              $val = preg_replace('/\s{8}/g', ' ', $val);
              $val = preg_replace('/\s{7}/g', ' ', $val);
              $val = preg_replace('/\s{6}/g', ' ', $val);
              $val = preg_replace('/\s{5}/g', ' ', $val);
              $val = preg_replace('/\s{4}/g', ' ', $val);
              $val = preg_replace('/\s{3}/g', ' ', $val);
              $val = preg_replace('/\s{2}/g', ' ', $val);
              Ответить
              • а почему не
                $val = preg_replace('/\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                $val = preg_replace('/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s/g', ' ', $val);
                Ответить
                • Прямо так и вижу Сизифа, катящего свой говнокамень вверх по уже накатанной дорожке...
                  Ответить
              • а еще лучше
                $val = preg_replace('/[ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                $val = preg_replace('/[ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n][ \t\r\n]/g', ' ', $val);
                ....
                Ответить
                • Батенька, да вам впору маны по рационализации регэкспов пейсать! XD
                  Ответить
            • Задачу на сях решал без всяких регулярок, и резало не только пробелы, а вообще все слишком часто повторяющиеся символы. Люди уже и подумать не могут с этими регулярками.
              Ответить
              • 2 Werdn
                )))
                >>>Люди уже и подумать не могут с этими регулярками.
                +1, да и \s не покрывает всех возможных пустых символов - неразывный пробел к примеру
                Ответить
                • кстати, вопрос таков, а на что заменять два рядом идущих неразрывных?
                  Зависит от целей такой вот чистки, мне так думается
                  Ответить
                • > \s не покрывает всех возможных пустых символов
                  и вообще он не касается никаких юникодных непечатных символов
                  Ответить
              • чушь несёте, лучшее решение этой задачи - регулярки
                Ответить
    • Обычно я решаю это так:

      $txt = preg_replace('/\s+/', ' ', $txt);
      Ответить
      • и все переносы тоже нах..
        Ответить
        • В нашем случае их в принципе не могло быть в данных, но если бы и были, то можно их принимать за wide-space characters.
          Ответить
      • для кого [[:space:]] придумали?
        Ответить

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