|
|
|
| Есть очень древний сайт, который работает на 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";
и т.д.
|
Трудности возникают не с самими рег. выражениями, а с тем, как это реализовать и с какой функцией... | |
|
|
|
|
|
|
|
для: 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 ? | |
|
|
|
|
|
|
|
для: xx77
(05.12.2008 в 14:33)
| | Да, все файлы .shtml
Про функцию, я имею в виду preg_match или как их там :) С ними я просто лично не знаком, но рег. выражения составить смогу.
Функцию обхода всех папок/подпапок я написал, могу переделать, если надо - не проблема... главное вытащить все эти переменные, чтобы связать статьи с категориями/подкатегориями.
Да, потом подключался файл
<!--#include virtual="/media/_mdatop.shtml" -->
|
Могу написать его содержание, - но там ничего важного, думаю, нет, т.к. он просто оформляет шапку страницы.
И еще - для начала я хочу создать промежуточный файл с вытащенными данными. Вручную пройтись, проверить, что надо а что нет - и все залить в базу... | |
|
|
|
|
|
|
|
для: 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]+ и в функции проверять имена переменных,
и что-то надо-бы предусмотреть , если не будет совпадения
// , запишется следующий файл с переменными от предидущего | |
|
|
|
|
|
|
|
для: 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 , то возможно и лучше сразу учесть в выражении,
но помня что в памяти выделится больше места занятого копией строк копируемой выражением из исходной строки.
И можно даже неподумать.ли о какой.нить ещё вызванной функции :) | |
|
|
|