Форум → Программирование → Пыхнуть хотите? → Готовые решения → Пример bb парсера
Пример bb парсера
Страницы: ← Следующая страница →
-
9 июня 2010 г. 16:14, спустя 21 минуту 31 секунду
о, FSM. Я до сих пор нихренашеньки в них не понимаю. -
9 июня 2010 г. 16:26, спустя 12 минут 21 секунду
На пыхе конечные автоматы делать моветон - тормозня сильная. -
9 июня 2010 г. 16:30, спустя 3 минуты 50 секунд
vasa_c, ага, но всё же смотря для чего. Парсить большие тексты конечно напряжно. А вот обратную польскую запись - вполне приемлемо. -
9 июня 2010 г. 16:41, спустя 10 минут 45 секунд
в тему: никто не юзал пекловское расширения для ббкодов? :)
http://ru.php.net/manual/en/bbcode.installation.php
на си написанный парсер стопудово лучше пыхиного)) а вот колво тегов и тп мне интересно, не сталкивались?Сапожник без сапог -
9 июня 2010 г. 16:49, спустя 8 минут 42 секунды
phpdude, помню на php.ru говорили что не удовлетворят кого-то по функционалу -
-
9 июня 2010 г. 16:56, спустя 2 минуты 56 секунд
ну я то и имел ввиду в вопросе )
phpdude, помню на php.ru говорили что не удовлетворят кого-то по функционалуСапожник без сапог -
25 августа 2010 г. 21:01, спустя 77 дней 4 часа 5 минут
Кому интересно немного оптимизировал код, если там можно сказать.
Кратко напомню, что это парсер bb кодов - тобишь букв заключенных в квадратные скобки как тут на форуме.
Работает сиё чудовище на конечном автомате, что даёт ему некоторые преимущества и недостатки. Их я не сильно знаю ибо в других парсерах не особо копался.
Что уже почти сделал по сравнению у ранее выложенным кодом:
1. Перевел на нормальный верблюжий стиль.
2. Отделил реализацию бб декодеров через интерфейс фабрики и интерфейс самого декодера, что позволяет нормально делать наборы своих обработчиков бб кодов.
3. Убрал мясорубную верстку из кода, короче выкинул её нахрен, что бы пользователь класса мог делать свою верстку.
4. Убрал call_user_func, теперь методы парсера вызываются напрямую конечным автоматом, что должно быть как бы быстрее.
5. Профиксил некоторые баги.
6. Добавил фичу показывать ббкод как не ббкод, то есть не учитывать ббкод как реальный.
Что планирую:
1. Вынести еще один уровень абстракции, чтобы можно было парсить хтмл хмл и прочие вещи, которые имеют граничные теги тоесть [] в бб кодах, <> в остальном…
Естественно совместимости нихрена тогда не будет.
Вообщем я к чему, если кому-то надо, могу выложить когда все затестю и т.п. -
25 августа 2010 г. 21:09, спустя 8 минут 4 секунды
выложи, возможно придется комменты кое где допиливать и эта штука пригодится -
25 августа 2010 г. 21:17, спустя 8 минут 8 секунд
regexp это тоже конечный автомат, можно комбинировать разбор регуляркой с небольшим кодом на php.
сходу твой код показался слишком громоздким для такой задачи.ιιlllιlllι унц-унц -
25 августа 2010 г. 23: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ι унц-унц -
26 августа 2010 г. 1:05, спустя 1 час 39 минут 31 секунду
artoodetoo, базара нет, на регуляркам можно много выиграть, да даже найтив поддежка, за которую дуд говорил тоже ниче…. но я за расширяемость и возможности… хотя посмотри что получится -
29 августа 2010 г. 16:30, спустя 3 дня 15 часов 25 минут
ускорил в 5 раз для текстов, ну пусть где-то от 10 кБ адресуя строку как $str{$i} , а не через substr… Да здравствует xdebug + webgrind, а то я, тупак, такой лажи не замечал… -
29 августа 2010 г. 18:57, спустя 2 часа 26 минут 8 секунд
мда, постестиk, посравнивал. Я вот думаю продолжать ли что то вообще если, например, xbb работает где то в 10 раз быстрее, там есть уже и редактор и расширяемость наверно не отстающая от моей и всякие рюшики (правда еще не понял как нормально парсить в UTF-8 и лицензия там GPL 2, а у меня LGPL)
Страницы: ← Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!