parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

Maxx 04.02.2008 20:48 / 04.02.2008 22:44

Я бы пошел немного другим путем, без использования таблиц, потому как в случае с тэгами - их может быть довольно много и табличка будет большая. При этом у тэгов возможна высокая повторяемость.

Вообще алгоритм здесь не сложный
Выбираем какой то ограничитель идентификаторов, пусть например /%...%/
$str[<-- здесь наш HTML -->]
$tReplaces[^table::create{from to
<  &lt^;
>  &gt^;}]
$hTags[^hash::create[]] ^rem{сюда складываем наши тэги и их MD5. 
Хэш нужен для того, чтобы два <p>, например сохранялись в одном экземпляре}
$str[^str.match[(<\/?[^^>]+>)][g]{
       $md5[^math:md5[$match.1]]
       $hTags.[$md5][$match.1]
       /%$md5%/
}]
^rem{теперь у нас в $str нет тэгов, махаем оставшиеся < >}
$str[^str.replace[$tReplaces]]

^rem{вертаем тэги назад}
^hTags.foreach[md5;tag]{
   $str[^str.match[/%$md5%/][g]{$tag}]
}
в качестве оптимизации можно из хэша тэгов перед восстановлением сделать таблицу замен, а потом сделать с помощью нее replace , а не делать кучу матчей. Но это надо проверять, не уверен что это быстрее.

Писал по памяти, мог и ошибиться