Помогите с xml дампом русской Википедии

программирование php xml Википедия MediaWiki

Есть xml дамп русской Википедии. Структура его следующая:
<mediawiki><page>
<title>Заголовок</title><id>380248</id><revision><id>2097005</id><timestamp>2008-12-16T14:07:23Z</timestamp><contributor><username>User</username><id>9835</id></contributor><minor /><comment>Комментарий</comment>
<text xml:space="preserve">Текст статьи с вики разметкой</text></revision></page>
И так далее
</mediawiki>
Задача такова:
Нужно удалить всё от <page> до </page> (с тегами page в том числе), если <title> начинается с ключевых слов: Файл:, Изображение:, Mediawiki: и Википедия:
После этого надо скопировать значение из титла, преобразовать его в url код и вставить после <text xml:space="preserve">{{оригинал статьи|http://ru.wikipedia.org/wiki/ ВОТ СЮДА }} Текст статьи с вики разметкой
чтобы имело вот такой вид: <text xml:space="preserve">{{оригинал статьи|http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA }} Текст статьи с вики разметкой
Помогите, ПОЖАЛУЙСТА!

Примечание:
Часть решения помог сделать добрый cheops вот на этом форуме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=62833
Но есть проблема, почему то удаляются некоторые статьи. Если обработать файл со статьями, то в файле result.txt кроме статей с ключевыми заголовками отсутствуют еще много статей. Вот скрипт
<?php
// Устанавливаем не ограниченное время выполнения скрипта
set_time_limit(0);
// Открываем дамп
$fd = fopen("dump.txt", "rb");
if(!$fd) exit("Файл отсутствует");
// Открываем файл для разультата
$fp = fopen("result.txt", "a");
if(!$fp) exit("Не возможности создать файл назначения");
// Флаги состоянния
$found_page = false;
$found_title = false;
$found_article = false;
$title = "";
$article = "";
$arr = array("Файл:", "Изображение:", "Mediawiki:", "Википедия:");
// Построчно анализируем файл
while($line = fgets($fd, 10000))
{
if(!$found_page)
{
// Начало новой статьи пока не найдено
if(stripos($line, "<page>") !== false)
{
$found_page = true;
$title = "";
$article = "";
}
}
else
{
// Начало статьи найдено
if(!$found_title)
{
if(stripos($line, "<title>") !== false)
{
// Найден заголовок
$found_title = true;
// Извлекаем названия
$pattern = "|<title>(.*?)</title>|is";
if(preg_match($pattern, $line, $out))
{
$title = $out[1];
// Игнорируем "Файл:", "Изображение:", "Mediawiki:", "Википедия:"
foreach($arr as $word)
{
if(stripos($line, $word) !== false)
{
$found_page = false;
$found_title = false;
}
}
}
}
}
else
{
if(!$found_article)
{
if(stripos($line, "<text") !== false)
{
$found_article = true;
$article .= $line;
}
}
else
{
$article .= $line;
if(stripos($line, "</text>") !== false)
{
$found_page = false;
$found_title = false;
$found_article = false;
// Оставляем запись в файле назначения
$pattern = "|<text[^>]+>(.*?)</text>|is";
if(preg_match($pattern, $article, $out))
{
fwrite($fp, "<page>
<title>".$title."</title>
<id>380248</id>
<revision>
<id>2097005</id>
<timestamp>2008-12-16T14:07:23Z</timestamp>
<contributor>
<username>mp_petrol</username>
<id>9835</id>
</contributor>
<minor />
<comment>Комментарий</comment>
<text xml:space=\"preserve\">{{Оригинал статьи|httр://ru.wikipedia.org/wiki/".rawurlencode($title).
"}} $out[1]</text></revision>
</page>\r\n"); }
}
}
}
}
}
// Закрываем файлы
fclose($fd);
fclose($fp);
?>
?>

Может кто попробует? Кусок дампа со статьями здесь http://www.softtime.ru/forum/files/...90223194204.txt
Ответы:
маловато фантиков даёшь, лень возиться.
Зачем же изобретать велосипед???
Я бы на вашем месте посмотрел бы на SimpleXML или DomDocument
Будет гораздо проще!!!


16 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.