Отладка скрипта для парсинга Википедии

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

Помогите найти ошибку в скрипте
Скрипт производит обработку xml документа, таким образом, что удаляет статьи, названия которых начинаются с ненужных ключевых слов (Файл:, Изображение:, Mediawiki: и Википедия: ), а потом добавляет в статью ссылку на оригинальную статью в Википедии. Рабочий скрипт, но проблема в том что удаляются и некоторые статьи не содержащие в титле ключевых слов. Не могу понять закономерность. Меняю местами статьи в обрабатываемом файле и удаляются разные статьи.
Вот скрипт
<?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);
?>
А вот структура xml дампа русской Википедии
<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>
Помогите, ПОЖАЛУЙСТА!

Примечание:
<?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>2005-01-14T19:08:01Z</timestamp>
<contributor>
<username>Максипедія</username>
<id>9835</id>
</contributor>
<minor />
<comment>Перекладено в Максипедії</comment>
<text xml:space=\"preserve\">&lt;noinclude&gt;{{Оригінал статті|httр://maxipedia.net/ru/www/".rawurlencode($title)."}}&lt;/noinclude&gt;
$out[1]</text>
</revision>
</page>\r\n");
}
}
}
}
}
}
// Закрываем файлы
fclose($fd);
fclose($fp);
?>

Примечание:
Японский Городовой прав. Кто нибудь отладить может?
Ответы:
тяжело ходить побираться-то?
А может вы для начала хотя бы форматирование кода сделаете, прежде чем просить других ковыряться в этом "спагетти"? Для кого отступы придумали? Или в институте уже не объясняют, что каждый блок { } - должен выделятся отступом? По сабжу - вы офигительный изобретатель велосипедов! Для парсинга XML - существуют готовые решения (а в PHP5, они уже встроены). Поищите по ВиО - не так давно тут уже был один писатель своего парсера, ему дали ответ с линками что заюзать, а не городить свои ошибки
он не может сделать форматирование. потому что не он этот код писал %)
ранше он ходил просто с протянутой рукой - напишите код. видать, кто-то написал. но криво.
теперь ходим, ищем, кто бы иправил :-)
черезвычайно непродуктивный способ решать проблемы, на мой взгляд.
=Японский Городовой прав. Кто нибудь отладить может?=
Вот здесь на форуме http://forum.fatal.ru/viewtopic.php?f=2&t=6945 обсуждается работа функции stripos. Внимательно прочитай, может быть ошибка кроется именно в той проблеме что обсуждается)).
=Господа, не будем строить из себя ангелочков=
Ангелочков? Не будем. Но вы посмотрите на этого пижона, вопрощающего. Мало того, что в тег коммент не вставлена ОБЯЗАТЕЛЬНАЯ строка (источник: википедия и ссылка, я не не знаю никого, кто бы используя информацию в тех или иных случаях, убирал бы ссылку на первоисточник) так еще он даже не попытался соврать что делает это сам. Лично я - лентяям, которые хотят за счет других работать, помогать никогда не буду. Хочешь чего - работай, тогда поможем. Нет - сиди дальше и гоняй в линейку до седин. Можете называть это неблагожелательностью.


16 лет назад

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

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

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