Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Распарсить несколько тысяч HTML файлов
 
 автор: FiX   (05.12.2008 в 13:04)   письмо автору
 
 

Есть очень древний сайт, который работает на SSI.
Задача - перевести весь архив в БД.

В начале каждого файла код:
<!--#set var="HMAG" value="Кардиология" -->
<!--#set var="HPATH" value="/cardiology/" -->
<!--#set var="HISSUE" value="Том 6" -->
<!--#set var="HTOPIC" value="ОРИГИНАЛЬНЫЕ СТАТЬИ" -->
<!--#set var="HTITLE" value="Лечение сердечно-сосудистых заболеваний" -->
<!--#set var="HAUTH" value="Е.В.Алтынова" -->
<!--#set var="HADDR" value="*Институт экспериментальной кардиологии РКНПК" -->


Как с помощью регулярных выражений привести данные строки в нормальный вид, чтобы потом перенести это в БД? Что-то типа

$HPATH = "/cardiology/";
$HISSUE = "Том 6";
и т.д.

Трудности возникают не с самими рег. выражениями, а с тем, как это реализовать и с какой функцией...

  Ответить  
 
 автор: xx77   (05.12.2008 в 14:33)   письмо автору
 
   для: FiX   (05.12.2008 в 13:04)
 

> и с какой функцией...

с рекурсивной ,) если всё не одной папкой
удобнее даже сделать ещё функцию которая будет вызываться из основной
, и например считывать обрабатывать и записывать отдельно взятый файл

Но смотря ещё какие файлы ,
тут после последней подзагрузки, своей личной библиотеки (не пожалел места, чтобы сдублировать в mysql text-файлы и inner-тексты из html, для полнотекстового поиска)
Всётаки не всё пролезло в базу данных , хоть и уже увеличивал до этого max_allowed_packet = 3M в mysql5/my.cnf
и максимально облегчённое добавление ~102595 файлов
заняло около 1500.xxxx секунд :)
Всего только искалось <title> если есть, и если html, своя замена strip_tags (стандартная сливала слова) и удаление всех не слов.
И без iconv(), лучшее что придумал сделать с кодировками, разсортировать по ним внутри рассортированного , и положить в папки файлы с указанием кодировк .
впрочем, я извлекаю из базы только адреса файлов , попытки phpMyAdmin'ом извлечь более одной записи, почти всегда не удаются :)
Ещё как-то нужно отличить то что заносить , а что нет
, похоже на то что за этими объявлениями переменных шло включение одних для всех файлов ,
или наоборот всё включалось файлом ?
И наверное расширениями не отличается , типа всё .html/.shtml ?

  Ответить  
 
 автор: FiX   (05.12.2008 в 15:30)   письмо автору
 
   для: xx77   (05.12.2008 в 14:33)
 

Да, все файлы .shtml

Про функцию, я имею в виду preg_match или как их там :) С ними я просто лично не знаком, но рег. выражения составить смогу.

Функцию обхода всех папок/подпапок я написал, могу переделать, если надо - не проблема... главное вытащить все эти переменные, чтобы связать статьи с категориями/подкатегориями.

Да, потом подключался файл
<!--#include virtual="/media/_mdatop.shtml" -->

Могу написать его содержание, - но там ничего важного, думаю, нет, т.к. он просто оформляет шапку страницы.

И еще - для начала я хочу создать промежуточный файл с вытащенными данными. Вручную пройтись, проверить, что надо а что нет - и все залить в базу...

  Ответить  
 
 автор: xx77   (05.12.2008 в 17:13)   письмо автору
 
   для: FiX   (05.12.2008 в 15:30)
 

Попроще будет наверное preg_replace_callback()
можно вместо переменных сделать массив
<pre><?php
$HMAG
=$HPATH=$HISSUE=$HTOPIC=$HTITLE=$HAUTH=$HADDR='';

function 
izvl($mtch) {
 global 
$HMAG$HPATH$HISSUE$HTOPIC$HTITLE$HAUTH$HADDR;
// print_r($mtch);
    
$HMAG =    $mtch[1];
    
$HPATH =    $mtch[2];
    
$HISSUE =    $mtch[3];
    
$HTOPIC =    $mtch[4];
    
$HTITLE =    $mtch[5];
    
$HAUTH =    $mtch[6];
    
$HADDR =    $mtch[7];
    return 
'';
}

$txt '<!--#set var="HMAG" value="Кардиология" --> 
<!--#set var="HPATH" value="/cardiology/" --> 
<!--#set var="HISSUE" value="Том 6" --> 
<!--#set var="HTOPIC" value="ОРИГИНАЛЬНЫЕ СТАТЬИ" --> 
<!--#set var="HTITLE" value="Лечение сердечно-сосудистых заболеваний" --> 
<!--#set var="HAUTH" value="Е.В.Алтынова" --> 
<!--#set var="HADDR" value="*Институт экспериментальной кардиологии РКНПК" -->
..................
....................
'
;
$s '<!--#set var="[A-Z]+" value="([^"]*)"[^>]*>\s*';
$reg "~^${s}${s}${s}${s}${s}${s}${s}~";

$txt preg_replace_callback($reg'izvl'$txt);

print_r($txt) && print "\n\n";
print 
'$HMAG=' $HMAG ."\n"
.'$HPATH=' $HPATH ."\n"
.'$HISSUE=' $HISSUE ."\n"
.'$HTOPIC=' $HTOPIC ."\n"
.'$HTITLE=' $HTITLE ."\n"
.'$HAUTH=' $HAUTH ."\n"
.'$HADDR=' $HADDR ."\n";

?>

но если переменные не всегда в таком порядке
, то придётся захватывать то что в [A-Z]+ и в функции проверять имена переменных,
и что-то надо-бы предусмотреть , если не будет совпадения
// , запишется следующий файл с переменными от предидущего

  Ответить  
 
 автор: FiX   (07.12.2008 в 22:19)   письмо автору
 
   для: xx77   (05.12.2008 в 17:13)
 

Все работает, спасибо!!!!
Но только сейчас понял - все-равно придется одновременно заносить и тексты в БД. Поэтому сейчас встал другой вопрос - какое рег. выражение нужно написать, чтобы в $HTEXT включить все, что под тегами
<!--#set var="HMAG" value="Кардиология" -->
<!--#set var="HPATH" value="/cardiology/" -->
<!--#set var="HISSUE" value="Том 6" -->
<!--#set var="HTOPIC" value="ОРИГИНАЛЬНЫЕ СТАТЬИ" -->
<!--#set var="HTITLE" value="Лечение сердечно-сосудистых заболеваний" -->
<!--#set var="HAUTH" value="Е.В.Алтынова" -->
<!--#set var="HADDR" value="*Институт экспериментальной кардиологии РКНПК" -->
<!-- ================================================================== -->
<b>Заголовок статьи</b><br>
Текст статьи, текст статьи с изображениями <img src="/65.jpg"> и так далее


Кстати, строка
<!-- ================================================================== -->

есть везде, её можно использовать как разграничитель...

ХЗ, так и смог разобраться со смыслом
$s = '<!--#set var="[A-Z]+" value="([^"]*)"[^>]*>\s*';
$reg = "~^${s}${s}${s}${s}${s}${s}${s}~";

$txt = preg_replace_callback($reg, 'izvl', $txt);

:)

  Ответить  
 
 автор: xx77 176x220   (07.12.2008 в 23:26)
 
   для: FiX   (07.12.2008 в 22:19)
 

В том примере из переменной $txt и вырезалось всё что совпадало с шаблоном, оставляя в $txt то что дальше.
Другое дело если что.то делать ещё с тем $txt , то возможно и лучше сразу учесть в выражении,
но помня что в памяти выделится больше места занятого копией строк копируемой выражением из исходной строки.
И можно даже неподумать.ли о какой.нить ещё вызванной функции :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования