Chuda
Гость
|
|
« : 07-08-2006 23:18 » |
|
Задача: есть текст xml, в котором главы отмечены как <chapter>название главы</chapter>, а вывести это надо жирным шрифтом и пронумеровать. То есть должно получиться <b>1. название главы</b>. само по себе <chapter> заменить на <b> проблем не вызывает? preg_replace("/<chapter>/","<b>",$input); А вот как ещё каждую из замен пронумеровать?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #1 : 08-08-2006 06:37 » |
|
А preg_replace наверное что-нибудь возвращает (скорее всего измененную строку)? Тебе тогда просто придется в preg_replace затолкать не весь текст, а по строчно. Если preg_replace вернула измененную строку, то увелич счетчик на единицу и будето что-то типа preg_replace("/<chapter>/","<b>"+$i,&input); (или не так синтаксис плохо помню). Может каряво, но пока других версий не было высказано ... А другой метод - в РНР есть возможность XML-парсинга, можно ей воспользоваться, изучать там немного и потом проблем не будет. Я сам эту возможность 2 года назад использовал, в принципе удобно.
|
|
« Последнее редактирование: 08-08-2006 06:39 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
Chuda
Гость
|
|
« Ответ #2 : 08-08-2006 06:49 » |
|
да, кстати, это меня глубокой ночью ступор хватил. Конечно же, штатная обработка XML. Попробую изучить - и отпишусь.
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #3 : 08-08-2006 06:54 » |
|
Дык, сама же писала, что спать полезно, иногда .
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Chuda
Гость
|
|
« Ответ #4 : 08-08-2006 07:06 » |
|
да я-то сплю вообще по хитрой системе, час в сутки получается. но вот мне сейчас это решение забраковали. потому как тем же скриптом надо будет нумеровать ещё разметку вида [chapter]глав
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #5 : 08-08-2006 07:34 » |
|
Ну еще один вариант есть. Вызывай preg_replace в цикле. Не помню можно ли в РНР так сравнивать строки, если нельзя, то переделать надо условие выхода из цикла. Вообще это только идея . $source_str="xcvnxkcjvnxkcjvkxcjv"; $source_dest=""; for($i=1;$source_str!=$source_dest;$i++) { $replacement="<b>"+$i; $source_dest=$source_str; source_str=preg_replace("/<chapter>/",replacement,source_dest,1); } Писал на скорую руку. Идея заключается в четвертом параметре функции preg_replacement()
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Chuda
Гость
|
|
« Ответ #6 : 08-08-2006 08:56 » |
|
сделала в цикле по одному - работает. Но вот насчёт быстродействия капитальные сомнения. $chapter_no = 0; do { $txt=preg_replace( "/\[(chapter)[\](.*?(?:\n.*?)*?)\[\/(\\1)?\]/i", "<strong>$header_no. \\2</strong>", $_txt=$txt, 1 ); $chapter_no++;
} while ($_txt!=$txt);
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #7 : 08-08-2006 09:02 » |
|
А есть на чем поэкспериментирвать? Возьми текст побольше, да и посмотри . Если уж слишком не будет устраивать, то можно будет еще подумать, глядишь народ что-нибудь подскажет. А XML- парсер нельзя использовать, потому что могут быть квадратные скобки вместо угловых? Есть ли в РНР функция для работ со строками, которую можно "переобучить". Т.е., к примеру, она будет искать нам символ и в случае нахождения вызывать функцию переданную по указателю или делать действия, которую мы можем задать? Что-то есть ведь подобное или я что-то путаю?
|
|
« Последнее редактирование: 08-08-2006 09:04 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
Chuda
Гость
|
|
« Ответ #8 : 08-08-2006 09:15 » |
|
угу, это как sax для xml. Только реализовывать своё вручную. Гуглю. Изобретать велосипед не хочется.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #9 : 08-08-2006 15:39 » |
|
Chuda, Ты сам XML файл преврашаеш в HTML формат или формируеш HTML файл на основе XML файла? Если второе, почему бы не применить схему: В цикле ишеш строку стояшую между тэгами <chapter></chapter> , как только нашла, запускаеш головной шаблон. Потом вставляеш найденную строку, затем запускаеш хвостовой шаблон. При дальнейших вумных мыслей заказчиков, все изменения будут только касаться шаблонов. Сам алгоритм не будет затрагиваться.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Chuda
Гость
|
|
« Ответ #10 : 08-08-2006 15:46 » |
|
Finch, практически так и сделано! Даже мои страхи по поводу быстродействия оказались напрасными.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #11 : 08-08-2006 16:06 » |
|
Chuda, попробуй preg_replace_callback() - никаких циклов и простой интерфейс.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Chuda
Гость
|
|
« Ответ #12 : 09-08-2006 19:27 » |
|
спасибо за совет, но что-то мне не удаётся найти внятную документацию по теме.
а тем временем заказчики придумали ещё хитрую задачу. Вот есть у меня уже функция, которая вполне сносно обрабатывает их хитрую разметку. и надо ввести тэг, внутри которого никакая разметка обрабатываться не будет. Вот как бы это сделать?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #13 : 09-08-2006 19:46 » |
|
На этом форуме есть такой тэг [ nobsd] вроде. Можно тебе сделать, что то вроде конечного автомата в облегченном виде. Встретила свое ключевое слово, обрабатываеш по одному алгоритму, Встретила второе ключевое слово, переключаеш алгоритм на второй режим. Программа будет иметь вид, извиняюсь за сишную нотацию /* Автомат выставляем на работу по умолчанию. В нашем случае это значение 1. Нулевое значение автомата обозначает конец отработки, значение 2 обозначает работу второму алгоритму */ int avt=1; while (avt !=0) { // ...... Тут делаем запрос данных, если данные закончились, то переводим автомат в значение 0 switch (avt) { case 1: // Производим обработку по алгоритму 1 // Если данные ключевое слово, переводим автомат в режим 2 break; case 2: // Производим обработку по алгоритму 2 // Если данные ключевое слово, переводим автомат в режим 1 break; } }
|
|
« Последнее редактирование: 09-08-2006 19:49 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Chuda
Гость
|
|
« Ответ #14 : 09-08-2006 19:59 » |
|
Finch, это работает в случае например посимвольной обработки текста. На пхп в случае объёмного текста это очень жестоко. Я применяю preg_replace, которой скармливается весь текст целиком. Как мне кажется, тут вариантов два: либо вырезать из текста куски, которые обрабатывать не надо, скармливать оставшееся на обработку preg_replace, а потом ставить необработанные куски на место; либо всё же обрабатывать вообще весь текст посимвольно (а эта идея мне кажется не очень хорошей). Ну или я ещё чего-то не знаю.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #15 : 09-08-2006 20:06 » |
|
Chuda, Специфику PHP я не знаю. В свое время я пару вечеров ради интереса копал и все мое знакомство на этом заканчивается.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Chuda
Гость
|
|
« Ответ #16 : 09-08-2006 20:15 » |
|
а специфика php такова: практически нет ничего такого, чего бы было на пхп реализовать невозможно, но скорость работы черепашья. Об оптимизации приходится думать постоянно. Засекать время работы скрипта - это вообще обязательно. Особенно если учесть, что скрипты эти как правило выполняются на хостинге, и ресурсов им выделяется самая малость, и велика вероятность, что их же придётся переносить на другой сервер. А будь свой сервер с рутовым доступом, было бы много проще.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #17 : 10-08-2006 13:17 » |
|
Chuda, проблем с доками я пока не замечал - на www.php.net очень хорошая документация с комментариями (в них не мало багов описано, а так же примеров работы). Если что-то действительно не описано, но описывай траблу и будем разбираться вместе. Да, php тормоз - далеко не С, но только если не пользоваться библиотечными ф-иями - они написаны на С. На club.shelek.com система шаблонов работает именно по принципу поиска и замены шаблона на результат работы ф-ий - на тормоза никто не жаловался.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|