![]() |
|
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]()
|
|
| Diesel Draft |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Для решения задачи мне надо написать шаблонизатор. Но тут просто запутался. Я могу сам написать но надо просто натолкнуть меня. Я даже сейчас все хорошо опишу.
Короче есть шаблон в HTML. Для парсання я выбрал xml_parse(). А чтоб он умел парсить я использую свои функции.
После парсинга на выходе должно получиться дерево. Оно может складываться з 2х типов данных: тег и литерал. Тегом считается любой HTML тек, содержащий активный атрибут. Например
Здесь тег "а" а остальное литералы. В плане дерева все выглядит так: root = { [0] => ' '; // текст до тега [1]=> { [name] => 'a' // название тега [htmlattributes] = { [id] => '23' } [fwattributes] = { [df] => 'df' } [children] = { // дочерние теги и литералы [0] => ' dfdf <b> fg </b> <b arts='df' /> <!-- dfdf --> ' } } [2] => ' <p> fgfdgd f</p>' } Думаю пример ясен. Вопрос: как это реализовать, а то я уже настолько в мыслях запутался что уже не могу. |
||||
|
|||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Я тут подумал, может пропарсить сначала все HTML теги и создать дерево с 3х элементов: BeginTag, InnerText, EndTag. А потом оптимизировать дерево. Парсер может себе позволить работать долго, все таки он парсит только 1 раз, а потом берет з кеша
|
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Что никто парсеров не делал
|
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Ех, вижу не кому не интересно.
Тогда хотя бы буду писать что уже сделал. Я тут надумал алгоритм. Основная проблема в том что не знаю кому принадлежит закрывающий тег. Я знаю что эту задачу можно решить стеком. Но не могу собраться с мыслями. И так, я почистил список чтоб выделить унарные теги (<tagname />). В идеале мне надо найти какие закрывающие теги закивают именно активные теги. Есть вариант построит дерево и по проходу сделать новый список, но уже все активные теги суммирую в один литерал. Ну что скажете? |
|||
|
||||
| Mushu |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 20.7.2004 Репутация: нет Всего: -5 |
Слишком накрученно.
Сразу возникает вопрос а что ты будешь делать с одинарными тегами..? |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Одинарные теги имеют те же свойства что и парные, но по дефолту не имеют детей.
Я знаю как это заделать, но не могу собраться с мыслями. Всегда что то кажется не так Это сообщение отредактировал(а) Diesel Draft - 20.7.2007, 11:12 |
|||
|
||||
| Golda |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 26.3.2007 Где: Ариель, Израиль Репутация: 5 Всего: 42 |
Хм, интересная задача оказалась. Вот что у меня получилось пока что:
Если вкратце, то активные теги разбираются полностью встроенными средствами XML Parser, а неактивные - "ручками". Смотрим, на каком байте парсер при открытии и закрытии тега, и выбираем нужный substring. Для исключения путаницы в ситуациях с вложенными одноименными неактивными тегами приходится отдельно хранить стек неактивных тегов. Правда, этот класс нельзя считать законченным. Я тут отождествила номер байта с номером символа строки, так что в неоднобайтных кодировках будут проблемы. Ну да это доделать несложно. Больше проблем в ситуации, когда активный тег вложен в неактивный. Это уже проблема не реализации, а постановки задачи. Подумайте, что Вы будете делать в таком случае. P.S. Тестирована на expat, на libxml2 функция xml_get_current_byte_index() может вести себя и по-другому (на php.net пишут, что ее результат может варьироваться в зависимости от имплементации XML Parser). Но, думаю, идея ясна Добавлено @ 14:13 Тестировала на XML:
Это сообщение отредактировал(а) Golda - 21.7.2007, 14:17 -------------------- "For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics |
||||
|
|||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Весьма интересно, заслужен плюсик
Сейчас нет времени, у меня срочный проект, который я должен закончить за ночь Вот что у меня сейчас есть:
П.С у меня HTML тоже не хочет парсерит. У меня тажа проблема. Главное я знаю как решить, но просто не могу сосредоточитса, поетому пишю сюда. ешение просто - надо узнать какие закрывающые теги актывны, и опредилить детей, а потом додать всех не активных соседей Это сообщение отредактировал(а) Diesel Draft - 21.7.2007, 21:35 |
|||
|
||||
| Golda |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 26.3.2007 Где: Ариель, Израиль Репутация: 5 Всего: 42 |
Diesel Draft, за + спасибо.
Хочу уточнить. Что Вы имеете в виду под незакрывающимися тегами? Если случай <tag attr='val'/>, то на нем мой алгоритм работает хорошо. А если <tag attr='val'> без парного закрывающего, то задача принципиально не имеет решения. Для невалидного XML xml_parse()всегда вернет false P.S. Если будете развивать свой пример, вынесите xml_set_object() из конструктора. Об этом много информации в комментариях пользователей на http://us2.php.net/manual/en/function.xml-set-object.php Это сообщение отредактировал(а) Golda - 22.7.2007, 15:28 -------------------- "For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Спасибо. Задача решаетса доволе просто, но запутано (вот я и запутался). Короче алгоритм такой: бедуем дерево , оно нужно для того чтоб узнать какие теги кому принадлежит. Потом проходим по дереву и снов создаем список. Теперь мы можем пододавать все не активные теги, ясли конечно они стоят рядом. Потом снов создаем дерево и все
Это сообщение отредактировал(а) Diesel Draft - 22.7.2007, 18:20 |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Блн, мне просто надо пропарсить HTML и получить DOM или подобную модель
Тема актуальна |
|||
|
||||
| Diesel Draft |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Я вот не понимаю, если есть ошибка то после не хочет парсер видеть закрывающие теги.
Например: видит
не видит
Что мне прийдетса всетаки использувать XHTML? |
||||
|
|||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Покопался в интернете и знайшов вот такой партер http://php-html.sourceforge.net/ .Думаю заюзать его
|
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
тема актуальна
|
|||
|
||||
| Golda |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 26.3.2007 Где: Ариель, Израиль Репутация: 5 Всего: 42 |
Diesel Draft, у Вас слишком специфические требования. HTML, который включает не HTML-аттрибуты. Парсеры, ориентированные на XML, Вам не подойдут, т.к. well-formness Вы не гарантируете. Можно использовать что-то, ориентированное на HTML, но могут возникнуть проблемы с использованием namespaces (судя по соседней теме, Вы с ними уже столкнулись). Все что приходит в голову, чтобы не писать парсер с нуля, возьмите какой-нибудь open-source HTML-парсер, например, тот, о котором Вы писали в одном из передыдущих постов, или выдерите из кода какого-нибудь open-source броузера, и переделывайте его под себя
-------------------- "For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: X технологии | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |