Есть гипотеза.
Поскольку парсинг реализован с помощью конечного автомата, - простого линейного алгоритма, то и мощность машины не очень сильно сказывается на скорости обработки: 2.7 сек против 1.7 сек.
А генерация html-a влечет за собой инициализацию десятков объектов, тысячи вызовов десятков функций. И здесь мощность машины уже сильно сказывается: 11.5 сек против 0.5 сек.
-~{}~ 23.03.07 20:45:
On Fri, 23 Mar 2007 14:55:55 +0300
Александр Глущенко <...> wrote:
> Приветствую вас дима, использую ваш класс xBB v. 0.24 и заметил очень
> нехорошую манеру неправильно обрабатывать линки..
>
> Например если скормить класу линк такого вида
http://xzxzxzxzx.xz/ddd а
> дальше текст, то обработает он его так - <a
> href="http://xzxzxzxzx.xz/ddd&nbsp;&nbsp;fffff"
> target="_blank">
http://xzxzxzxzx.xz/ddd&nbsp;&nbsp;а дальше текст</a>
> Т.е захватывает и следущий текст в линк. Очень хотелось бы узнать как
> поправить сие, т.к класс действительно хороший..
> --
> Александр Глущенко.
>
Дело в том, что скрипт сперва заменяет двойной пробел ' ' на '&nbsp;&nbsp;' а уже потом ищет и обрабатывает линки. Причем линком считает любую строку, которая начинается с 'http://' или 'https://' или 'ftp://' или 'www.' и заканчивается пробельным символом, запятой, кавычкой и т.п. Знак & может быть частью ссылки, поэтому тоже захватывается. Исправить можно так:
1. Найдите строки
PHP:
$text = str_replace(' ', ' ', $text);
if ($this -> autolinks) {
$uri = "[\w\d-]+\.[\w\d-]+[^\s<\"\']*[^.,;\s<\"\'\)]+";
$search = array(
"'(.)((http|https|ftp)://".$uri.")'si",
"'([^/])(www\.".$uri.")'si",
"'([^\w\d-\.])([\w\d-\.]+@[\w\d-\.]+\.[\w]+[^.,;\s<\"\'\)]+)'si"
);
$replace = array(
'$1<a href="$2" target="_blank">$2</a>',
'$1<a href="http://$2" target="_blank">$2</a>',
'$1<a href="mailto:$2">$2</a>'
);
$text = preg_replace($search, $replace, $text);
}
2. Замените их на
PHP:
if ($this -> autolinks) {
$uri = "[\w\d-]+\.[\w\d-]+[^\s<\"\']*[^.,;\s<\"\'\)]+";
$search = array(
"'(.)((http|https|ftp)://".$uri.")'si",
"'([^/])(www\.".$uri.")'si",
"'([^\w\d-\.])([\w\d-\.]+@[\w\d-\.]+\.[\w]+[^.,;\s<\"\'\)]+)'si"
);
$replace = array(
'$1<a href="$2" target="_blank">$2</a>',
'$1<a href="http://$2" target="_blank">$2</a>',
'$1<a href="mailto:$2">$2</a>'
);
$text = preg_replace($search, $replace, $text);
}
$text = str_replace(' ', ' ', $text);
Счастливо, Д.
-~{}~ 24.03.07 20:49:
У проекта xBB теперь собственный репозиторий, расположенный по адресу svn://svn.prolib.ru:3692
-~{}~ 24.03.07 20:51:
Это - усилиями
Whirlwind-а
-~{}~ 25.03.07 14:50:
xBB версии 0.26
Отличается от 0.25 следующим:
1. Несколько оптимизирован код.
2. Добавлено свойство
stat со статистикой по обрабатываемому BBCode (время парсинга, время генерации HTML-а, число тегов BBCode, максимальное число уровней вложенности).
3. Исправлено несколько багов.
4. Добавлено еще несколько мелких фичек (дополнительные атрибуты для
anchor и
font, добавление протокола
svn:// в автоматические ссылки и т.п.).
5. Исправлена документация.
6. Переделан тестовый скрипт.
Скачать zip-архив со скриптом, тестами и набором смайликов можно здесь: http://www.pc.uz/files/illustrations/bbcode/xbb026-light.zip