|
|
|
|
<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>
И так далее
|
Задача такова:
Нужно удалить всё от <page> до </page> (с тегами page в том числе), если <title> начинается с ключевых слов: Файл:, Изображение:, Mediawiki: и Википедия:
После этого надо скопировать значение из титла, преобразовать его в url код и вставить после <text xml:space="preserve">{{оригинал статьи|httр://ru.wikipedia.org/wiki/ ВОТ СЮДА }} Текст статьи с вики разметкой
чтобы имело вот такой вид:
<text xml:space="preserve">{{оригинал статьи|httр://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA }} Текст статьи с вики разметкой</text>
|
Помогите, ПОЖАЛУЙСТА! Программирование не знаю. А учить пхп ради одной задачи, нет времени. | |
|
|
|
|
|
|
|
для: mp_petrol
(23.02.2009 в 17:22)
| | 1) Ссылочку на дамп не дадите или приведите запись, в которой есть Файл:, Изображение:, Mediawiki: и Википедия: - они так и начинаются или используется вики-раметка вида [[Файл:1.gif|tumb|150px|Пример]]?
2) Image: учитывать?
PS Вы не счетчик правок часом ремонтируете? | |
|
|
|
|
|
|
|
для: mp_petrol
(23.02.2009 в 17:22)
| | Информации мало, у вас там utf8 или как и где расположен "Текст статьи с викиразметкой"? В общем дамп бы нужен оригинальный или хотя бы кусочек в файле из двух статей (с файлом и обычной статьей), чтобы воспроизвести ситуацию можно было.
<?php
// Открываем директорию
$text = '<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>
И так далее
<page>
<title>[[Файл:1.gifЗаголовок]]</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>
И так далее';
$arr = array("Файл:", "Изображение:", "Mediawiki:", "Википедия:");
// Удаляем лишние записи
foreach($arr as $word)
{
$pattern = "|<page>[\s]*<title>[^<]*".preg_quote($word)."[^<]+</title>(.+?)</page>|is";
$text = preg_replace($pattern, "", $text);
}
// Извлекаем названия
$pattern = "|<title>(.*?)</title>|is";
preg_match_all($pattern, $text, $out);
if(!empty($out[1]))
{
for($i = 0; $i < count($out[1]); $i++)
{
// $out[1][$i]
echo "<text xml:space=\"preserve\">".
"{{{$out[1][$i]}|httр://ru.wikipedia.org/wiki/".
rawurlencode($out[1][$i])."}} Текст статьи с вики разметкой</text>";
}
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(23.02.2009 в 18:13)
| | В названии между <title></title> вики разметки нет, кодировка utf8. А вот между <text xml:space="preserve"></text> текст с вики разметкой. Дамп базы Википедии находится здесь http://download.wikimedia.org/ruwiki/20081228/ruwiki-20081228-pages-articles.xml.bz2 но размер зархивированого 500 мб. В разархивированном виде около 2Гб. Поэтому привожу кусок оригинального дампа.
А вот маленький файл (кусок дампа) | |
|
|
|
|
|
|
|
для: mp_petrol
(23.02.2009 в 19:42)
| | Почемуто не могу закачать файл на форум.
Может где нибудь в другом месте залить? | |
|
|
|
|
|
|
|
для: mp_petrol
(23.02.2009 в 19:57)
| | Почему, файл загрузился - справа дискета. | |
|
|
|
|
 7.7 Кб |
|
|
для: mp_petrol
(23.02.2009 в 19:42)
| | Прикреплю файл в виде архива, чтобы не расползалась тема. | |
|
|
|
|
|
|
|
для: mp_petrol
(23.02.2009 в 19:42)
| | Хм... 2 Гб придется последовательно анализировать, наскоком столько просто в память, отведенную скрипту не влезет. Сейчас чего-нибудь придумаем... | |
|
|
|
|
|
|
|
для: cheops
(23.02.2009 в 20:01)
| | Теперь вижу, что загрузился.
Я файл могу разбить на куски и обрабатывать частями. | |
|
|
|
|
|
|
|
для: mp_petrol
(23.02.2009 в 20:20)
| | Слушайте, а вы где обрабатывать будете, вам расширение mb_string() доступно? Следующее скрипт формально делает все правильно, однако, судя по всему бъет кодировку UTF-8 на операциях с регулярными выражениями в категориях, посвященных другим языковым разделам (или у меня редактор неправильно их отображает)
<?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, "<text xml:space=\"preserve\">{{".$title.
"|httр://ru.wikipedia.org/wiki/".rawurlencode($title).
"}} $out[1]</text>\r\n");
}
}
}
}
}
}
// Закрываем файлы
fclose($fd);
fclose($fp);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(23.02.2009 в 21:04)
| | Всё работает. И кодировка нормально отображается
Только я неточно объяснил что надо получить в результате.
Я когда писал что надо получить
<text xml:space="preserve">{{оригинал статьи|httр://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA }} Текст статьи с вики разметкой</text>
| просто для краткости опустил все остальные теги
А надо чтобы получилось
<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">{{оригинал статьи|httр://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA }} Текст статьи с вики разметкой</text>
</revision>
</page>
|
И я внес маленькое изменение
fwrite($fp, "<text xml:space=\"preserve\">{{".$title.
"|httр://ru.wikipedia.org/wiki/".rawurlencode($title).
"}} $out[1]</text>\r\n");
|
на
fwrite($fp, "<text xml:space=\"preserve\">{{Оригинальная статья|httр://ru.wikipedia.org/wiki/".rawurlencode($title).
"}} $out[1]</text>\r\n");
|
Оригинальная статья - это не переменная, это название шаблона | |
|
|
|
|
|
|
|
для: mp_petrol
(23.02.2009 в 22:32)
| | И еще маленькое изменение и все то что мне нужно
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");
|
Осталось только проверить не бедет ли конфликтовать при импорте, если все <id> будут одинаковыми. | |
|
|
|
|
|
|
|
для: mp_petrol
(23.02.2009 в 23:06)
| | Есть проблема.
Почему то удаляются некоторые статьи. Если обработать тот файл, который я выслал, то в файле result.txt кроме статей с ключевыми заголовками отсутствуют еще много статей (помечены минусами). И нет никакой закономерности.
- Изображение:Websphere logo.png
F.
- Изображение:Азиан Вэнс.jpg
Влад IV Монах
Static (альбом)
Static
EMI (значения)
Даре, Жак
Жак Даре
- Медаль «За службу в подводных силах»
Амбидекстр
- Сеченово (Нижегородская область)
EMI (физический термин)
Вернер фон Фрич
- Даре
Сеченовский район
- Изображение:Абдуллаев, Ровнаг Ибрагим оглы.jpg
Контрреволюция
Категория:Бад-Мускау
- Медаль «За службу в Космических войсках»
Alessandro Sommella
- Стадион Десятилетия
Кун, Якоб
Федор Емельяненко
- Исаакиевский мост
Силья Лайн
- - Нидерландский языковой союз
Корнилов, Дмитрий Владимирович
Маркерное кольцо
- Шанигартен
Харар
Соммелла, Алессандро
IEEE 802.5
- Александровский уезд
Сабры (цабарим)
- Sommella, Alessandro
Меньцзянь
- - Пойковский 2008 (шахматный турнир)
Гран-При Баку 2008 (Шахматный турнир)
А после этого я обработал только те файлы, которые были опущены. И все, кроме двух(помечены двумя минусами) попали в файл result.txt | |
|
|
|
|
|
|
|
для: mp_petrol
(24.02.2009 в 13:13)
| | Статьи, содержащие "Изображение:" вы сами просили исключить - если они нужны, необходимо удалить эту подстроку из массива
<?php
$arr = array("Файл:", "Изображение:", "Mediawiki:", "Википедия:");
?>
|
Чтобы воспроизвести и отладить ситуацию с другими статьями - нужен кусок дампа с окрестностью (пару статей ту и обратно) вокруг них. | |
|
|
|
|
|
|
|
для: mp_petrol
(24.02.2009 в 13:13)
| | >А после этого я обработал только те файлы, которые были опущены. И все, кроме двух
>(помечены двумя минусами) попали в файл result.txt
А дамп с опущенными статьями большой? Чтобы отладить ситуацию - её следует воспроизвести. | |
|
|
|
|
 64 Кб |
|
|
для: cheops
(25.02.2009 в 02:29)
| | Статьи с ключевыми титлами удаляются - это всё правильно.
Я обработал тот файл, который закачал Вам на сайт, то-есть 1.4 Мб.
А вот я закачал файл содежащий только опущенные статьи (14 статей помеченных минусами). Интересно у Вас тоже кроме изображений исчезнут Нидерландский языковой союз и Пойковский 2008 (шахматный турнир).
Нет такого большого шрифта, для того что-бы выразить Вам ОГРОМНОЕ Спасибо! | |
|
|
|