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

    +163

    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
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    Example #3 preg_replace_callback() using recursive structure to handle encapsulated BB code
    <?php
    $input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";
    
    function parseTagsRecursive($input)
    {
    
        $regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
    
        if (is_array($input)) {
            $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
        }
    
        return preg_replace_callback($regex, 'parseTagsRecursive', $input);
    }
    
    $output = parseTagsRecursive($input);
    
    echo $output;
    ?>

    Не знаю, баян или нет. Поиском не смог найти preg_replace_callback на этом сайте.
    В таком недлинном коде есть очень аппетитное дерьмецо (кроме языка). Если в качестве $input взять строку подлиннее, то интерпретатор, как Чак Норрис, сосчитает до бесконечности. Исправляется добавлением одного символа к коду.

    Запостил: inkanus-gray, 03 Июля 2011

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

    • greedy regex?
      Ответить
      • В регэкспе дело, но даже не в жадности. А конкретно в том, как разворачивается фраза типа
        (?:[^[]|(?R))+
        Короче, входная строка сопоставляется с (?R) и происходит рекурсивный вызов на каждом символе строки, что приводит к аду уже когда длина входной строки около сотни символов.

        Спойлер: Убийца — дворецкий. Если добавить плюсик после первой альтернативы, то зацикливание внезапно исчезает: (?:[^[]+|(?R))+

        Можете кидать в меня камни. Пример взят с php.net из документации по упомянутой функции. О том, к чему приводит подобный код, ни на одной странице ни слова.
        Ответить

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