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

    +6

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    $redir_url = $_conf['www_patch'].str_replace("//////","/",$path[0]);
    	$redir_url = $_conf['www_patch'].str_replace("/////","/",$path[0]);
    	$redir_url = $_conf['www_patch'].str_replace("////","/",$path[0]);
    	$redir_url = $_conf['www_patch'].str_replace("///","/",$path[0]);
    	$redir_url = $_conf['www_patch'].str_replace("//","/",$path[0]);

    Ну ниасилили ребята регулярки...

    Запостил: Lblss, 07 Июля 2016

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

    • for ($i = 0; $i < 5; $i++) {
      	$redir_url = $_conf['www_patch'].str_replace("//","/",$path[0]);
      }

      i fixed it.

      ЗЫ а как бы это сделали функциональщики на хацкале?
      Ответить
      • > ЗЫ а как бы это сделали функциональщики на хацкале?

        Нормализавали бы путь?
        Ответить
      • $redir_url = $_conf['www_patch'].implode('/', array_filter(explode('/', $path[0]), function($value){return !empty($value);}));


        http://ideone.com/qo8N0l

        Хотя нет, тут нужно придумать что-нибудь с рекурсией.
        Ответить
        • > Хотя нет, тут нужно придумать что-нибудь с рекурсией.

          Держите
          module Main where
          
          foldSlashes :: String -> String
          foldSlashes [] = []
          foldSlashes ('/':xs) = '/' : foldSlashes (dropWhile (== '/') xs)
          foldSlashes (x:xs) = x : foldSlashes xs
          
          main = sequence_ $ map (putStrLn . foldSlashes)
                 [ "///Hello/you/there"
                 , "//what's//up//man////"
                 , "/////////////////////////////////SO////MUCH///SLASHES//////////////////"
                 , "NO SLASHES HERE"
                 ]
          Ответить
        • (defun normalize-path (path)
            (labels ((%rec (c s f)
                       (let ((slashp (and c (char= (car c) #\/))))
                       (cond
                         ((and c slashp (not f)) (%rec (cdr c) s nil))
                         (c (princ (car c) s) (%rec (cdr c) s (not slashp)))))))
              (with-output-to-string (s) (%rec (coerce path 'list) s t))))
          
          (normalize-path "a///b/c////////d//////")
          "a/b/c/d/"

          В лучших традициях.
          Ответить
          • фи, как энергично

            Чтобы было похоже, нужно запилить хотя-бы ленивые стримы, чтобы тормозилоработало в константном объёме памяти.
            Ответить
            • Это не нормальный код на Лиспе. Так по-настоящему никто писать не будет, начиная уже с конвертирования строк в списки, ну и рекурсию никто не будет для этого писать.
              Ответить
              • > Это не нормальный код на Лиспе

                Это и ёжику понятно, потому и рекомендовал ещё и ленивых стримов запилить для смеха.
                Ответить
        • p([X, Y]) --> [X, Y], { X \= 47 ; Y \= 47 }.
          p([]) --> "//".
          ps(X) --> p(X) | p(Y), ps(Z), { append(Y, Z, X) }.
          
          ?- phrase(ps(X), `a///b/c/////d/////`), string_codes(Z, X).
          X = [97, 47, 98, 47, 99, 47, 100, 47],
          Z = "a/b/c/d/"

          Не функционально.
          Ответить
          • Только это лажа, и работает неправильно...
            null(X) :- var(X) -> X = [] ; true.
            end(X, Y) --> X | [], { Y = [] }.
            slashes(`/`) --> "/", end(slashes(`/`), _), ! | "/".
            verb([Y | Z]) --> ( [Y], end(verb(Z), Z), ! | [Y] ), { Y \= 47, null(Z) }.
            spath(X) --> ( slashes(Y), verb(Z), end(path(W), W), !
                         | slashes(Y), end(verb(Z), Z)
                         | slashes(Y)
                         ), { null(Z), null(W), append([Y, Z, W], X) }.
            path(X) --> spath(X) | verb(Y), spath(Z), { append(Y, Z, X) }.
            Ответить
    • Ну, вот и однострочник на пайсоне пожаловал

      teststring = '''\\\\\\asdf\\\\\\fdsasdf\\\\\\\\ f\\\\sad \\\\'''
      print(reduce(lambda res, t: res if res and res[-1] == '\\' and t[0] == '\\' else res + t[0], teststring))
      Ответить
      • Ой, шо то я совсем сплю. Правильнее так:

        teststring = '''\\\\\\asdf\\\\\\fdsasdf\\\\\\\\ f\\\\sad \\\\'''
        print(reduce(lambda res, t: res if res and res[-1] == '\\' and t == '\\' else res + t, teststring))
        Ответить

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