ФорумПрограммированиеПыхнуть хотите?Готовые решения → Пример bb парсера

Пример bb парсера

  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 9 июня 2010 г. 4:52

    Выложил пример bb парсера. Это древний говнокод, но вроде пашет. Так что если кому интересно, то вот http://itdumka.com.ua/index.php?cmd=shownode&node=20
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 9 июня 2010 г. 5:14, спустя 21 минуту 31 секунду

    о, FSM. Я до сих пор нихренашеньки в них не понимаю.
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 9 июня 2010 г. 5:26, спустя 12 минут 21 секунду

    На пыхе конечные автоматы делать моветон - тормозня сильная.
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 9 июня 2010 г. 5:30, спустя 3 минуты 50 секунд

    vasa_c, ага, но всё же смотря для чего. Парсить большие тексты конечно напряжно. А вот обратную польскую запись - вполне приемлемо.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 9 июня 2010 г. 5:41, спустя 10 минут 45 секунд

    в тему: никто не юзал пекловское расширения для ббкодов? :)

    http://ru.php.net/manual/en/bbcode.installation.php

    на си написанный парсер стопудово лучше пыхиного)) а вот колво тегов и тп мне интересно, не сталкивались?
    Сапожник без сапог
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 9 июня 2010 г. 5:49, спустя 8 минут 42 секунды

    phpdude, помню на php.ru говорили что не удовлетворят кого-то по функционалу
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 9 июня 2010 г. 5:53, спустя 3 минуты 30 секунд

    да, это такое же гавно, как и var_filter
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 9 июня 2010 г. 5:56, спустя 2 минуты 56 секунд


    phpdude, помню на php.ru говорили что не удовлетворят кого-то по функционалу
    ну я то и имел ввиду в вопросе )
    Сапожник без сапог
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 25 августа 2010 г. 10:01, спустя 77 дней 4 часа 5 минут

    Кому интересно немного оптимизировал код, если там можно сказать.
    Кратко напомню, что это парсер bb кодов - тобишь букв заключенных в квадратные скобки как тут на форуме.
    Работает сиё чудовище на конечном автомате, что даёт ему некоторые преимущества и недостатки. Их я не сильно знаю ибо в других парсерах не особо копался.
    Что уже почти сделал по сравнению у ранее выложенным кодом:
    1. Перевел на нормальный верблюжий стиль.
    2. Отделил реализацию бб декодеров через интерфейс фабрики и интерфейс самого декодера, что позволяет нормально делать наборы своих обработчиков бб кодов.
    3. Убрал мясорубную верстку из кода, короче выкинул её нахрен, что бы пользователь класса мог делать свою верстку.
    4. Убрал call_user_func, теперь методы парсера вызываются напрямую конечным автоматом, что должно быть как бы быстрее.
    5. Профиксил некоторые баги.
    6. Добавил фичу показывать ббкод как не ббкод, то есть не учитывать ббкод как реальный.
    Что планирую:
    1. Вынести еще один уровень абстракции, чтобы можно было парсить хтмл хмл и прочие вещи, которые имеют граничные теги тоесть [] в бб кодах, <> в остальном…
    Естественно совместимости нихрена тогда не будет.

    Вообщем я к чему, если кому-то надо, могу выложить когда все затестю и т.п.
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 25 августа 2010 г. 10:09, спустя 8 минут 4 секунды

    выложи, возможно придется комменты кое где допиливать и эта штука пригодится
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 25 августа 2010 г. 10:17, спустя 8 минут 8 секунд

    regexp это тоже конечный автомат, можно комбинировать разбор регуляркой с небольшим кодом на php.
    сходу твой код показался слишком громоздким для такой задачи.
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 25 августа 2010 г. 12:25, спустя 2 часа 8 минут 1 секунду

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

    => <b>

    но общая схема, помоему, рабочая

    <?php

    error_reporting(-1);

    define('PAIR_OF_TAGS', '\[(\w++)[^\]]*+\](?1)\[/\2\]');
    define('NON_TAG', '[^\[\]]++');
    define('SELF_CLOSING', '\[\w[^\]]*/\]');
    define('OPEN_TAG', '\[\w++[^\]]*+\]');
    define('CLOSE_TAG', '\[/\w++]');
    define('CODE_BLOCK', '\[code\].*?\[/code\]');

    $verifyRegex = '{^((?:'.PAIR_OF_TAGS.'|'.NON_TAG.'|'.SELF_CLOSING.'|'.CODE_BLOCK.')*+)$}isx';
    $splitRegex = '{('.CODE_BLOCK.')|('.SELF_CLOSING.')|('.OPEN_TAG.')|('.CLOSE_TAG.')}isx';

    $text = 'bold [ins]text italic[/ins][br/]
    blablabla
    ';

    header('Content-type: text/plain');

    if (preg_match($verifyRegex, $text)) {
    echo "block structure seems valid\n\n";
    $parts = preg_split($splitRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    foreach ($parts as $p) {
    if (preg_match('{^'.CODE_BLOCK.'$}isx', $p)) {
    $p = '<pre>' . htmlspecialchars(substr($p, 6, -7)) . '</pre>';
    } else if (preg_match('{^'.SELF_CLOSING.'|'.OPEN_TAG.'|'.CLOSE_TAG.'$}isx', $p)) {
    $p = '<' . substr($p, 1, -1) . '>';
    } else {
    $p = htmlspecialchars($p);
    }
    echo $p . "\n";
    }
    } else {
    echo "block structure seems invalid\n\n";
    }
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 25 августа 2010 г. 14:05, спустя 1 час 39 минут 31 секунду

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

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 29 августа 2010 г. 5:30, спустя 3 дня 15 часов 25 минут

    ускорил в 5 раз для текстов, ну пусть где-то от 10 кБ адресуя строку как $str{$i} , а не через substr… Да здравствует xdebug + webgrind, а то я, тупак, такой лажи не замечал…
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 29 августа 2010 г. 7:57, спустя 2 часа 26 минут 8 секунд

    мда, постестиk, посравнивал. Я вот думаю продолжать ли что то вообще если, например, xbb работает где то в 10 раз быстрее, там есть уже и редактор и расширяемость наверно не отстающая от моей и всякие рюшики (правда еще не понял как нормально парсить в UTF-8 и лицензия там GPL 2, а у меня LGPL)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!