Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Преобразование хтмл файла
Форумы портала PHP.SU » PHP » Программирование на PHP » Преобразование хтмл файла

Страниц (1): [1]
 

1. Yappa - 04 Июня, 2008 - 16:14:57 - перейти к сообщению
Привет!
У меня есть такая задача:
1) пользователь загружает на сервер хтмл файл. (это понятно как делать)
2) пхп скрипт читает загруженный файл, изменяет его и выводит измененную версию.

Загружаемый файл кроме "шапки" пары вступлений и тд содержит в себе табличку.
Необходимо некоторые столбцы таблицы удалить вообще, содержимое определенных ячеек преобразить и тп. а пользователю показать уже мое оформление и измененную под мой вкус таблицу..

к примеру исходный вид одной строки исходной таблички такой:
(в ячейках таблицы какие-то данные, в скобках я просто обозвала их чтобы показаь что с ними потом делать)
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <tr>
  3.     <td>{from}</td>
  4.     <td>{to}</td>
  5.     <td>{nyo}</td>
  6.     <td>{nyo?!}</td>
  7.   </tr>


а моя табличка должна содержать чтото вроде
CODE (text):
скопировать код в буфер обмена
  1. <tr>
  2.     <td>{from}.{хитрые штуки}</td>
  3.     <td>{to}</td>
  4.     <td>{nyo}*28-42.{desu}</td>
  5.     <td>картинка</td>
  6.     <td>вообще новые данные</td>
  7.     <td>и чтото вроде {nyo?!}{to}{from}</td>
  8.   </tr>


как это лучше делать если:
1) таблица может содержать и 40 и 40000 строк - предугадать нельзя ) Такчто сразу грузить файл в массив или читать целиком нельзя.
2) файл генерируется абсолютно сторонней программой, тоесть при создании в нем нельзя поставить никаких "меточек" для упрощения разбора..
3) Страница всегда разная по содержанию, но одинакова по структуре.
4) переносы строки в файле (не <БР> а в коде) могут быть вразброс.
5) до таблицы есть некоторые нужные мне данные! их тоже надо выдрать
трудность собственно в том - как определить где в файле что написано и убедиться что у меня в руках цельная строка таблицы и ее можно править )

Как это дело парсить? как я представляю это :
нахожу в теле <body>, дальше ищу элементы обрамленными известными мне тегами и "на веру" принимаю их последовательно как нужные мне элементы..
Можно составить большое регексп выражение и читать файл по символу "примеривая" к шаблону прочитанное - а как совпадет - разбирать.. далее искать следующий кусок и тп... но схема подобной штуки для меня представляется уж больно сложновато...

Какие есть другие подходы? Или может какая-нить готовая технология существует? )
2. valenok - 04 Июня, 2008 - 17:09:01 - перейти к сообщению
Вам пожоже везде нужно просто заменить
{from} на какуюто другую запись.
str_replace
3. Yappa - 04 Июня, 2008 - 17:12:46 - перейти к сообщению
valenok пишет:
Вам пожоже везде нужно просто заменить
{from} на какуюто другую запись.
str_replace


нет нет нет, это я просто обозначила, что в данной ячейке будет некое значение которое означает "от".

Файл не шаблон - он уже с данными.
4. valenok - 04 Июня, 2008 - 20:33:39 - перейти к сообщению
Так я не понял, исходный файл, который тебе загружают
может выглядеть так:

Вариант А
CODE (text):
скопировать код в буфер обмена
  1. <tr>
  2. <td>Коля</td>
  3. <td>Петя</td>
  4. <td>Вася</td>
  5. <td>Мася</td>
  6. </tr>


Вариаент Б
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <tr>
  3. <td>Коля.Инокентий</td>
  4. <td>Петя</td>
  5. <td>Вася*28-42.Мася</td>
  6. <td>картинка</td>
  7. <td>вообще новые данные</td>
  8. <td>и чтото вроде КоляВасяПетя</td>
  9. </tr>


И тебе нужно из варианта А получиьт вариант Б ?

В первй строке всегда поле ОТ
во второй строке всегда КОМУ и т.д. ?

Или там может быть как попало ?
Тут никак не определешь.
Только если хотябы помечаться будут <td id='from'>..</td>
5. scuter - 04 Июня, 2008 - 22:06:12 - перейти к сообщению
можно через регулярное выражение,
я как то раз это делал так.
'|<tr[^>]*>(.*)</tr>|siU'
6. Yappa - 05 Июня, 2008 - 09:30:32 - перейти к сообщению
valenok пишет:
И тебе нужно из варианта А получиьт вариант Б ?

В первй строке всегда поле ОТ
во второй строке всегда КОМУ и т.д. ?


Да да! Именно так!

valenok пишет:
Только если хотябы помечаться будут <td id='from'>..</td>


Как я уже писала, "2) файл генерируется абсолютно сторонней программой, тоесть при создании в нем нельзя поставить никаких "меточек" для упрощения разбора.." -_-

scuter пишет:
можно через регулярное выражение,
я как то раз это делал так.
'|<tr[^>]*>(.*)</tr>|siU


А у вас не осталось кусочка кода разбора? ^_^
7. Yappa - 06 Июня, 2008 - 12:09:50 - перейти к сообщению
вопрос решен, спасибо )

 

Powered by ExBB FM 1.0 RC1