Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function LibFictofile_Parse_Archiveofourown($content, $fic)
- {
- // Проверяю на 404
- if (mb_strpos($content, 'Error 404') !== false)
- {
- return array('error'=>'404');
- }
- // Достаю название и шапку
- if(!preg_match('/<dl class="work meta group" role="complementary">(.*?)<\/dl>.*?<h2 class="title heading">(.*?)<\/h2>.*?<h3 class="byline heading">(.*?)<\/h3>.*?<blockquote class="userstuff">(.*?)<\/p>[^<]*?<\/blockquote>/ius', $content, $matches))
- {
- if(!preg_match('/<dl class="work meta group" role="complementary">(.*?)<\/dl>.*?<h2 class="title heading">(.*?)<\/h2>.*?<h3 class="byline heading">(.*?)<\/h3>/ius', $content, $matches))
- {
- return array('error'=>'1');
- }
- else
- {
- $matches[4] = 'Нет описания';
- }
- }
- $fic['head'] = $matches[1];
- $fic['title'] = trim($matches[2]);
- // автор
- $fic['authors'] = '';
- preg_match_all('/\/users\/([^\/]*?)\/[^>]*?>([^<]*?)</ius', $matches[3], $matches2, PREG_SET_ORDER);
- if(count($matches2) == 0)
- {
- return array('error'=>'1');
- }
- else
- {
- foreach($matches2 AS $tmp)
- {
- $fic['authors'] .= $tmp[2].', ';
- $fic['authors_info'][] = array('id' => $tmp[1], 'name' => $tmp[2]);
- }
- $fic['authors'] = mb_substr($fic['authors'], 0, -2);
- }
- // саммари
- $fic['summary'] = strip_tags(str_replace('</p>', '<br/>', trim($matches[4])), '<br/>');
- // фандомы
- $fic['fandoms'] = '';
- $fic['fandoms_arr'] = array();
- if(preg_match('/<dd class="fandom tags">[^<]*<ul class="commas">(.*?)<\/ul>/ius', $fic['head'], $matches))
- {
- preg_match_all('/href="([^"]*?)".*?>([^<]*?)<\/a>/ius', $matches[1], $matches3, PREG_SET_ORDER);
- foreach($matches3 AS $tmp)
- {
- $fic['fandoms'] .= trim($tmp[2]).', ';
- $fic['fandoms_arr'][$tmp[1]] = $tmp[2];
- }
- if($fic['fandoms'] != '')
- {
- $fic['fandoms'] = mb_substr($fic['fandoms'], 0, -2);
- }
- }
- // пейринг и Персонажи
- $fic['paring'] = '';
- if(preg_match('/<dd class="relationship tags">[^<]*<ul class="commas">(.*?)<\/li>[^<]*?<\/ul>/ius', $fic['head'], $matches))
- {
- $fic['paring'] = trim(strip_tags(str_replace('</li>', ', ', trim($matches[1]))));
- }
- if(preg_match('/<dd class="character tags">[^<]*<ul class="commas">(.*?)<\/li>[^<]*?<\/ul>/ius', $fic['head'], $matches))
- {
- if($fic['paring'] == '')
- {
- $fic['paring'] = trim(strip_tags(str_replace('</li>', ', ', trim($matches[1]))));
- }
- else
- {
- $characters = '';
- preg_match_all('/href="[^"]*?".*?>([^<]*?)<\/a>/ius', $matches[1], $matches4, PREG_SET_ORDER);
- foreach ($matches4 AS $tmp)
- {
- if(strpos($fic['paring'], $tmp[1]) === false)
- {
- $characters .= ', '.$tmp[1];
- }
- }
- $fic['paring'] .= $characters;
- }
- }
- if($fic['paring'] != '')
- {
- $paring = '<b>Персонажи:</b> '.$fic['paring'].'<br/><br/>';
- }
- // рейтинг
- $fic['rating'] = '';
- if(preg_match('/<dd class="rating tags">[^<]*<ul class="commas">[^<]*<li><a.*?href="[^"]*".*?>(.*?)<\/a><\/li>/ius', $fic['head'], $matches))
- {
- $tmp = trim(strip_tags($matches[1]));
- switch($tmp)
- {
- case 'Not Rated':
- $fic['rating'] = '';
- break;
- case 'General Audiences':
- $fic['rating'] = 'General';
- break;
- case 'Teen And Up Audiences':
- $fic['rating'] = 'PG-13';
- break;
- case 'Mature':
- $fic['rating'] = 'R';
- break;
- case 'Explicit':
- $fic['rating'] = 'NC-17';
- break;
- }
- }
- if($fic['rating'] != '')
- {
- $rating = '<b>Рейтинг:</b> '.$fic['rating'].'<br/><br/>';
- }
- //категория
- $fic['het_slash'] = 0;
- if(preg_match('/<dd class="category tags">[^<]*<ul class="commas">(.*?)<\/ul>/ius', $fic['head'], $matches))
- {
- if(strpos($matches[1], 'Other') !== false || strpos($matches[1], 'Multi') !== false || strpos($matches[1], '</li><li>') !== false)
- {
- $fic['het_slash'] = 5;
- $het_slash = 'Смешанная';
- }
- else
- {
- $tmp = trim(strip_tags($matches[1]));
- switch ($tmp)
- {
- case 'F/M':
- $fic['het_slash'] = 1;
- $het_slash = 'Гет';
- break;
- case 'M/M':
- $fic['het_slash'] = 2;
- $het_slash = 'Слэш';
- break;
- case 'Gen':
- $fic['het_slash'] = 3;
- $het_slash = 'Джен';
- break;
- case 'F/F':
- $fic['het_slash'] = 4;
- $het_slash = 'Фемслэш';
- break;
- }
- }
- }
- if($fic['het_slash'] != 0)
- {
- $het_slash = '<b>Категория:</b> '.$het_slash.'<br/><br/>';
- }
- // метки
- $fic['keyword'] = '';
- if(preg_match('/<dd class="freeform tags">[^<]*<ul class="commas">(.*?)<\/li>[^<]*?<\/ul>/ius', $fic['head'], $matches))
- {
- $fic['keyword'] = trim(strip_tags(str_replace('</li>', ', ', trim($matches[1]))));
- }
- if($fic['keyword'] != '')
- {
- $keywords = '<b>Метки:</b> '.$fic['keyword'].'<br/><br/>';
- }
- $fic['publ_permission'] = 0;
- if(mb_strpos($fic['keyword'], 'Not copy to another site') !== false || mb_strpos($fic['keyword'], 'Don't copy to another site') !== false || mb_strpos($fic['keyword'], 'Don’t copy to another site') !== false)
- {
- $fic['publ_permission'] = 2;
- }
- // язык
- $fic['language'] = '';
- $fic['not_russian'] = '0';
- if(preg_match('/<dd class="language">(.*?)<\/dd>/ius', $fic['head'], $matches))
- {
- $fic['language'] = trim($matches[1]);
- if($fic['language'] != 'Русский')
- {
- $fic['not_russian'] = '1';
- }
- }
- if($fic['language'] != '')
- {
- $language = '<b>Язык:</b> '.$fic['language'].'<br/><br/>';
- }
- // даты
- if(preg_match('/<dd class="published">(\d{4}-\d{2}-\d{2})<\/dd>/ius', $fic['head'], $matches))
- {
- $fic['date_first'] = strtotime($matches[1]);
- }
- if(preg_match('/<dd class="status">(\d{4}-\d{2}-\d{2})<\/dd>/ius', $fic['head'], $matches))
- {
- $fic['date_last'] = strtotime($matches[1]);
- }
- else
- {
- $fic['date_last'] = $fic['date_first'];
- }
- // статус
- $fic['status'] = 2;
- if(preg_match('/<dd class="chapters">(\d*)\/(.*?)<\/dd>/ius', $fic['head'], $matches))
- {
- if($matches[2] == '?')
- {
- $status = 'В процессе написания';
- $fic['status'] = 2;
- }
- elseif($matches[1] == $matches[2])
- {
- $status = 'Закончен';
- $fic['status'] = 1;
- }
- else
- {
- $status = 'В процессе написания';
- $fic['status'] = 2;
- }
- $status = '<b>Статус:</b> '.$status.'<br/><br/>';
- }
- // перевод
- $fic['is_translation'] = 0;
- $fic['original_author'] = '';
- $fic['original_url'] = '';
- if(preg_match('/<li>.*?A translation of.*?<a href="([^"]*?)">[^<]*?<\/a> by <a.*?>([^<]*?)<\/a>/ius', $content, $matches))
- {
- $fic['is_translation'] = 1;
- $fic['original_author'] = $matches[2];
- $fic['original_url'] = $fic['domen'].$matches[1];
- }
- // для обнуления старых предупреждений, куда писалась категория
- $fic['warning'] = '';
- // шапка
- $fic['head'] = '<b>Ссылка:</b> '.$fic['pagetosave'].$fic['default_id'].'<br/><br/><b>Автор:</b> '.$fic['authors'].'<br/><br/><b>Фандом:</b> '.$fic['fandoms'].'<br/><br/>'.$paring.$rating.$het_slash.$keywords.$language.$status.'<b>Аннотация:</b> '.$fic['summary'];
- // примечание
- if(preg_match('/<h3 class="heading">Summary:<\/h3>\s*<blockquote class="userstuff">.*?<\/blockquote>\s*<\/div>\s*<div class="notes module" role="complementary">\s*<h3 class="heading">Notes:<\/h3>\s*<blockquote class="userstuff">(.*?)<\/blockquote>/ius', $content, $matches))
- {
- $fic['author_comment'] = strip_tags(str_replace('</p>', '<br/>', trim($matches[1])), '<br/>');
- }
- // удаляем выравненные по центру изображения
- $content = preg_replace('/<div[^>]*>[^<]*<p>[^<]*<img[^>]*>[^<]*<\/p>[^<]*<\/div>/ius', '', $content);
- $content = str_replace('<h3 class="heading">Notes:</h3>', '<br/>Notes:<br/>', $content);
- $content = str_replace('<h3 class="landmark heading" id="work">Chapter Text</h3>', '', $content);
- $content = preg_replace('/<div align="center">[^<]*<p>\*\*\*<\/p>[^<]*<\/div>/ius', '* * *', $content);
- // замена h2 и списков
- $content = preg_replace('/<[ou]l>(.*?)<\/[ou]l>/ius', '$1', $content);
- $content = preg_replace('/<h2>(.*?)<\/h2>/ius', '<p><b>$1</b></p>', $content);
- $content = preg_replace('/<li>(.*?)<\/li>/ius', '<p>$1</p>', $content);
- // достаю главы
- if (preg_match_all('/<h3 class="title">(.*?)<\/h3>/ius', $content, $tmp3, PREG_SET_ORDER))
- {
- $tmp = explode('<!--main content-->', $content);
- $count = count($tmp);
- $j = 0;
- for($i=1; $i < $count; $i++)
- {
- $tmp2 = explode('<!--/main-->', $tmp[$i]);
- $chapters[$j][1] = $tmp3[$j][1];
- $chapters[$j][2] = $tmp2[0];
- $j++;
- }
- }
- else
- {
- if (!preg_match_all('/<!-- chapter management -->.*?<h3 class="title">(.*?)<\/h3>.*?<!--main content-->(.*?)<!--\/main-->/ius', $content, $chapters, PREG_SET_ORDER))
- {
- //echo "1 no\r\n";
- if (!preg_match_all('/<h2 class="title heading">(.*?)<\/h2>.*?<!--chapter content-->(.*?)<!--\/chapter-->/ius', $content, $chapters, PREG_SET_ORDER))
- {
- //echo "2 no\r\n";
- // убираю тэг выравнивания по центру, который сбивает следующий шаблон
- $content = preg_replace('/<div align="\w+">(.*?)<\/div>/ius', '$1', $content);
- if (!preg_match_all('/<h2 class="title heading">(.*?)<\/h2>.*?<div id="chapters" role="article">(.*?)<\/div>/ius', $content, $chapters, PREG_SET_ORDER))
- {
- //echo "3 no\r\n";
- $tmp = explode('<div id="chapters" role="article">', $content);
- $tmp = explode('</div>', $tmp[1]);
- $chapters[0][2] = $tmp[0];
- $chapters[0][1] = $fic['title'];
- }
- }
- }
- }
- $fic['chapters_count'] = count($chapters);
- $fic['length_kb'] = 0;
- $fic['length_words'] = 0;
- for($i=0; $i < $fic['chapters_count']; $i++)
- {
- $fic['chapter_'.($i+1)]['title'] = trim(strip_tags($chapters[$i][1]));
- $fic['chapter_'.($i+1)]['text'] = trim($chapters[$i][2]);
- $fic['chapter_'.($i+1)]['text'] = str_replace(array('<blockquote>', '</blockquote>'), '', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = preg_replace('/[\s]*?<\/p>[^<]*<p[^>]*>[\s]*?/ius', '<br/>', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = str_replace('<em>', '<i>', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = str_replace('</em>', '</i>', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = str_replace('<strong>', '<b>', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = str_replace('</strong>', '</b>', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = str_replace("\r", '', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = str_replace("\n", ' ', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = str_replace('–', '-', $fic['chapter_'.($i+1)]['text']);
- $fic['chapter_'.($i+1)]['text'] = strip_tags($fic['chapter_'.($i+1)]['text'], '<br/><b><i><u><center><s><hr/>');
- $fic['chapter_'.($i+1)]['text'] = trim(preg_replace('/^Chapter Text/ius', '', $fic['chapter_'.($i+1)]['text']));
- $fic['chapter_'.($i+1)]['text'] = trim(preg_replace('/^Work Text:/ius', '', $fic['chapter_'.($i+1)]['text']));
- $fic['length_kb'] += mb_strlen($fic['chapter_'.($i+1)]['text']);
- $fic['length_words'] += LibStr_CountWords($fic['chapter_'.($i+1)]['text']);
- }
- $fic['chapters_count'] += 1;
- $fic['length_kb'] = ceil($fic['length_kb']/1000);
- return $fic;
- }
- // Парсинг страницы с fanfiction.net
- function LibFictofile_Parse_Fanfiction($content, $fic)
- {
- // Проверяю на 404
- if(mb_strpos($content, 'Unable to locate story. Code 1.') !== false)
- {
- return array('error'=>'404');
- }
- // Достаю название и шапку
- if(preg_match('/<a class=xcontrast_txt[\s]+href=\"(.*?)\">(.*?)<\/a>.*?<b class=\'xcontrast_txt\'>([^<]*?)<\/b>.*?<a class=\'xcontrast_txt\' href=\'\/u\/([\d]{1,11})\/.*?\'>(.*?)<\/a>.*?<div style=\'margin-top:2px\' class=\'xcontrast_txt\'>(.*?)<\/div>.*?Rated:[^>]*?>(.*?)<\/a>\s+-(.+?)-(.*?)<\/div>/ius', $content, $matches))
- {
- $fic['authors'] = trim($matches[5]);
- $fic['authors_info'][] = array('id' => $matches[4], 'name' => $fic['authors']);
- $fic['title'] = trim($matches[3]);
- $fic['summary'] = trim($matches[6]);
- $fic['fandoms'] = trim($matches[2]);
- if(mb_strpos($matches[2], 'Crossover') !== false)
- {
- preg_match('/\/(.*?)_and_(.*?)_crossovers/ius', $matches[1], $fandoms_urls);
- preg_match('/(.*?) \+ (.*?) Crossover/ius', $matches[2], $fandoms_titles);
- if(count($fandoms_urls) == 3 && count($fandoms_titles) == 3)
- {
- $fic['fandoms_arr'][$fandoms_urls[1]] = $fandoms_titles[1];
- $fic['fandoms_arr'][$fandoms_urls[2]] = $fandoms_titles[2];
- }
- }
- else
- {
- $fic['fandoms_arr'][$matches[1]] = trim($matches[2]);
- }
- $fic['rating'] = '';
- switch($matches[7])
- {
- case 'Fiction K':
- case 'Fiction K+':
- $fic['rating'] = 'General';
- break;
- case 'Fiction T':
- $fic['rating'] = 'PG-13';
- break;
- case 'Fiction M':
- $fic['rating'] = 'R';
- break;
- }
- if($fic['rating'] !== '')
- {
- $rating = '<b>Рейтинг:</b> '.$fic['rating'].'<br/><br/>';
- }
- $fic['genre'] = '';
- $fic['paring'] = '';
- $tmp = explode('- Chapters:', $matches[9]);
- $tmp = explode('- Words:', $tmp[0]);
- $tmp = explode(' - ', $tmp[0]);
- $maybe_count = count($tmp);
- if($maybe_count == 2)
- {
- $fic['genre'] = trim($tmp[0]);
- $fic['paring'] = trim($tmp[1]);
- }
- elseif($maybe_count == 1)
- {
- if(mb_strpos($tmp[0], '/') !== false)
- {
- $fic['genre'] = trim($tmp[0]);
- }
- elseif(mb_strpos($tmp[0], '.') !== false || mb_strpos($tmp[0], ',') !== false)
- {
- $fic['paring'] = trim($tmp[0]);
- }
- else
- {
- $genres = LibFictofile_GenreListArray_Fanfiction();
- foreach($genres AS $genre)
- {
- if(mb_strpos($tmp[0], $genre) !== false)
- {
- $fic['genre'] = trim($tmp[0]);
- continue;
- }
- }
- if($fic['genre'] == '')
- {
- $fic['paring'] = trim($tmp[0]);
- }
- }
- }
- if($fic['paring'] !== '')
- {
- $paring = '<b>Персонажи:</b> '.$fic['paring'].'<br/><br/>';
- }
- if($fic['genre'] !== '')
- {
- $genre = '<b>Жанр:</b> '.$fic['genre'].'<br/><br/>';
- }
- $size = '';
- if(preg_match('/Words:\s+([0-9,]*?)\s+-/ius', $matches[9], $matches2))
- {
- $size = '<b>Размер:</b> '.declension(str_replace(',', '', $matches2[1]), 'слово,слова,слов').'<br/><br/>';
- }
- $status = '<b>Статус:</b> В процессе написания<br/><br/>';
- $fic['status'] = '2';
- if(mb_strpos($matches[9], 'Complete'))
- {
- $status = '<b>Статус:</b> Закончен<br/><br/>';
- $fic['status'] = '1';
- }
- $fic['language'] = trim($matches[8]);
- $fic['not_russian'] = '0';
- if($fic['language'] != 'Russian')
- {
- $fic['not_russian'] = '1';
- }
- $language = '<b>Язык:</b> '.$fic['language'].'<br/><br/>';
- if(preg_match('/Published: <span data-xutime=\'(\d{9,10})\'>/ius', $matches[9], $matches2))
- {
- $fic['date_first'] = $matches2[1];
- }
- if(preg_match('/Updated: <span data-xutime=\'(\d{9,10})\'>/ius', $matches[9], $matches2))
- {
- $fic['date_last'] = $matches2[1];
- }
- else
- {
- $fic['date_last'] = $fic['date_first'];
- }
- $fic['head'] = '<b>Ссылка:</b> '.$fic['pagetosave'].$fic['default_id'].'<br/><br/><b>Автор:</b> '.$fic['authors'].'<br/><br/><b>Фандом:</b> '.$matches[2].'<br/><br/>'.$paring.$rating.$genre.$language.$status.$size.'<b>Аннотация:</b> '.$fic['summary'];
- $fic['head'] = str_replace("\r", '', $fic['head']);
- $fic['head'] = preg_replace("/[\n]+/u", "\n", $fic['head']);
- }
- else
- {
- return array('error'=>'1');
- }
- // Достаю главы
- $fic['length_kb'] = 0;
- $fic['length_words'] = 0;
- $i = 1;
- $dom = new DOMDocument();
- @$dom->loadHTML($content);
- $xpath = new DOMXPath($dom);
- $hasChapters = $xpath->evaluate("boolean(//select[@id='chap_select'])");
- $story_chapters = $xpath->query("//select[@id='chap_select']/option");
- if ($hasChapters)
- {
- foreach ($story_chapters as $chapter)
- {
- $title = trim($chapter->nodeValue);
- if (mb_strpos($title, $i.'.') === 0)
- {
- $title = str_replace($i.'. ', '', $title);
- $fic['chapter_'.$i]['title'] = $title;
- $content1 = LibFictofile_GetContent($fic['pagetosave'].$fic['default_id'].'/'.$i.'/', true);
- $content1 = LibFictofile_GetContent_Fanfiction_Unzip($content1);
- $tmp = explode("id='storytext'>", $content1);
- $tmp = explode('</div>', $tmp[1]);
- $innerHTML = $tmp[0];
- $innerHTML = str_replace('<hr size=1 noshade>', '', $innerHTML);
- $innerHTML = preg_replace('/<p style=[\'"]text-align:center;[\'"]>(.*?)<\/p>/ius', '<br/><center>$1</center><br/>', $innerHTML);
- $innerHTML = str_replace('<br>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<p>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<P>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<em>', '<i>', $innerHTML);
- $innerHTML = str_replace('</em>', '</i>', $innerHTML);
- $innerHTML = str_replace('<strong>', '<b>', $innerHTML);
- $innerHTML = str_replace('</strong>', '</b>', $innerHTML);
- $innerHTML = str_replace("\r", '', $innerHTML);
- $innerHTML = str_replace("\n", ' ', $innerHTML);
- $innerHTML = str_replace('–', '-', $innerHTML);
- $innerHTML = strip_tags($innerHTML, '<br/><b><i><u><center><s>');
- $fic['chapter_'.$i]['text'] = $innerHTML;
- $fic['length_kb'] += mb_strlen($fic['chapter_'.$i]['text']);
- $fic['length_words'] += LibStr_CountWords($fic['chapter_'.$i]['text']);
- }
- else
- {
- break;
- }
- $i++;
- }
- $fic['chapters_count'] = $i;
- }
- // Если одна глава
- else
- {
- $fic['chapter_1']['title'] = $fic['title'];
- $tmp = explode("id='storytext'>", $content);
- $tmp = explode('</div>', $tmp[1]);
- $innerHTML = $tmp[0];
- $innerHTML = str_replace('<hr size=1 noshade>', '', $innerHTML);
- $innerHTML = preg_replace('/<p style=[\'"]text-align:center;[\'"]>(.*?)<\/p>/ius', '<br/><center>$1</center><br/>', $innerHTML);
- $innerHTML = str_replace('<br>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<p>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<P>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<em>', '<i>', $innerHTML);
- $innerHTML = str_replace('</em>', '</i>', $innerHTML);
- $innerHTML = str_replace('<strong>', '<b>', $innerHTML);
- $innerHTML = str_replace('</strong>', '</b>', $innerHTML);
- $innerHTML = str_replace("\r", '', $innerHTML);
- $innerHTML = str_replace("\n", ' ', $innerHTML);
- $innerHTML = str_replace('–', '-', $innerHTML);
- $innerHTML = strip_tags($innerHTML, '<br/><b><i><u><center><s>');
- $fic['chapter_1']['text'] = $innerHTML;
- $fic['chapters_count'] = 2;
- $fic['length_kb'] = mb_strlen($fic['chapter_1']['text']);
- $fic['length_words'] = LibStr_CountWords($fic['chapter_1']['text']);
- }
- $fic['length_kb'] = ceil($fic['length_kb']/1024);
- return $fic;
- }
- // Парсинг страницы с fanfiktion.de
- function LibFictofile_Parse_Fanfiktionde($content, $fic)
- {
- // Проверяю на 404
- if(mb_strpos($content, '404 - Not Found') !== false)
- {
- return array('error'=>'404');
- }
- // Достаю название и шапку
- if(preg_match('/Geschichte:(.*?)<\/span>.*?von <a href="\/u\/([^"]*?)".*?<\/span>(.*?)<\/a>.*?small-font center block">(.*?)<span.*?<\/span>(.*?)\/(.*?)<\/div>.*?<div class="block">(.*?)<\/div>.*?title="erstellt"><\/span>(.*?)<\/div>.*?title="aktualisiert"><\/span>(.*?)<\/div>.*?title="(in Arbeit|Fertiggestellt|Pausiert|Abgebrochen)".*?title="Kapitel"><\/span><span class="semibold">(\d+?)<\/span>/ius', $content, $matches))
- {
- if(preg_match_all('/<a\s+href="(.*?)"[^>]?>(.*?)<\/a>/ius', $matches[1], $matches2, PREG_SET_ORDER))
- {
- $count = count($matches2);
- $fic['title'] = $matches2[$count-1][2];
- $full_default_url = $matches2[$count-1][1];
- if(count($matches2) == 5 && strpos($matches2[$count-2][2], $matches2[$count-3][2]) === false)
- {
- $fic['fandoms'] = $matches2[$count-3][2].' - '.$matches2[$count-2][2];
- }
- else
- {
- $fic['fandoms'] = $matches2[$count - 2][2];
- }
- $fic['fandoms_arr'][$matches2[$count-2][1]] = $fic['fandoms'];
- }
- else
- {
- return array('error'=>'1');
- }
- $fic['authors'] = trim($matches[3]);
- $fic['authors_info'][] = array('id' => $matches[2], 'name' => $fic['authors']);
- $fic['rating'] = '';
- $fic['het_slash'] = 1;
- switch(trim($matches[6]))
- {
- case 'P6':
- $fic['rating'] = 'General';
- break;
- case 'P12':
- case 'P16':
- $fic['rating'] = 'PG-13';
- break;
- case 'P12 Slash':
- $fic['rating'] = 'PG-13';
- $fic['het_slash'] = 2;
- break;
- case 'P16 Slash':
- $fic['rating'] = 'R';
- $fic['het_slash'] = 2;
- break;
- case 'P18':
- case 'P18-AVL':
- $fic['rating'] = 'NC-17';
- break;
- case 'P18 Slash':
- case 'P18-AVL Slash':
- $fic['rating'] = 'NC-17';
- $fic['het_slash'] = 2;
- break;
- }
- if($fic['rating'] !== '')
- {
- $rating = '<b>Рейтинг:</b> '.$fic['rating'].'<br/><br/>';
- }
- $het_slash = ($fic['het_slash'] == 1)?'Гет':'Слэш';
- $het_slash = '<b>Категория:</b> '.$het_slash.'<br/><br/>';
- $fic['genre'] = trim($matches[4]).', '.$matches[5];
- $genre = '<b>Жанр:</b> '.$fic['genre'].'<br/><br/>';
- $fic['paring'] = str_replace("\n", ', ', str_replace("\r", '', trim(strip_tags($matches[7]))));
- if($fic['paring'] != '')
- {
- $paring = '<b>Персонажи:</b> '.$fic['paring'].'<br/><br/>';
- }
- $fic['date_first'] = strtotime(preg_replace('/(\d{2})\.(\d{2})\.(\d{4})/', "$3-$2-$1", $matches[8]));
- $fic['date_last'] = strtotime(preg_replace('/(\d{2})\.(\d{2})\.(\d{4})/', "$3-$2-$1", $matches[9]));
- $fic['status'] = '2';
- switch($matches[10])
- {
- case 'in Arbeit':
- $fic['status'] = '2';
- $status = 'В процессе';
- break;
- case 'Fertiggestellt':
- $fic['status'] = '1';
- $status = 'Закончен';
- break;
- case 'Pausiert':
- case 'Abgebrochen':
- $fic['status'] = '3';
- $status = 'Заморожен';
- break;
- }
- $status = '<b>Статус:</b> '.$status.'<br/><br/>';
- $fic['chapters_count'] = $matches[11];
- $content_summary = LibFictofile_GetContent($fic['domen'].'/?a=v&storyid='.$fic['default_id'].'&s=1', true);
- if(strpos($content_summary, '<div class="story-summary-ajax">') === false)
- {
- return array('error'=>'1');
- }
- $fic['summary'] = trim(strip_tags($content_summary));
- $fic['head'] = '<b>Ссылка:</b> '.$fic['domen'].$full_default_url.'<br/><br/><b>Автор:</b> '.$fic['authors'].'<br/><br/><b>Фандом:</b> '.$fic['fandoms'].'<br/><br/>'.$paring.$het_slash.$rating.$genre.$status.'<b>Аннотация:</b> '.$fic['summary'];
- }
- else
- {
- return array('error'=>'1');
- }
- // Достаю главы
- $fic['length_kb'] = 0;
- $fic['length_words'] = 0;
- preg_match('/<option value="\d+" selected="selected">(.*?)<\/option>/ius', $content, $matches3);
- $fic['chapter_1']['title'] = trim($matches3[1]);
- $tmp = explode('<div id="storytext">', $content);
- $tmp = explode('<div class="clearfloat">', $tmp[1]);
- $text = $tmp[0];
- $text = preg_replace('/<!-- T\[style type="bold"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<b>$1</b>', $text);
- $text = preg_replace('/<!-- T\[style type="italic"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<i>$1</i>', $text);
- $text = preg_replace('/<!-- T\[style type="underlined"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<u>$1</u>', $text);
- $text = preg_replace('/<!-- T\[style type="(underlined,bold|bold,underlined)"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<u><b>$1</b></u>', $text);
- $text = preg_replace('/<!-- T\[style type="(underlined,italic|italic,underlined)"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<u><i>$1</i></u>', $text);
- $text = preg_replace('/<!-- T\[style type="(bold,italic|italic,bold)"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<b><i>$1</i></b>', $text);
- $text = preg_replace('/<!-- T\[style type="(bold,italic,underlined|italic,bold,underlined|underlined,italic,bold|underlined,bold,italic|bold,underlined,italic|italic,underlined,bold)"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<u><b><i>$1</i></b></u>', $text);
- $text = preg_replace('/<!-- T\[align type="center"\]T -->(.*?)<!-- T\[\/align\]T -->/ius', '<center>$1</center>', $text);
- $text = preg_replace('/<!-- T\[align type="right"\]T -->(.*?)<!-- T\[\/align\]T -->/ius', '<right>$1</right>', $text);
- $text = strip_tags($text, '<br/><br><br /><b><i><u><center><right>');
- $fic['chapter_1']['text'] = trim($text);
- $fic['length_kb'] += mb_strlen($fic['chapter_1']['text']);
- $fic['length_words'] += LibStr_CountWords($fic['chapter_1']['text']);
- if($fic['chapters_count'] > 1)
- {
- for($i = 2; $i <= $fic['chapters_count']; $i++)
- {
- $content = LibFictofile_GetContent($fic['domen'].str_replace('/1/', '/'.$i.'/', $full_default_url), true);
- preg_match('/<option value="\d+" selected="selected">(.*?)<\/option>/ius', $content, $matches3);
- $fic['chapter_'.$i]['title'] = trim($matches3[1]);
- $tmp = explode('<div id="storytext">', $content);
- $tmp = explode('<div class="clearfloat">', $tmp[1]);
- $text = $tmp[0];
- $text = preg_replace('/<!-- T\[style type="bold"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<b>$1</b>', $text);
- $text = preg_replace('/<!-- T\[style type="italic"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<i>$1</i>', $text);
- $text = preg_replace('/<!-- T\[style type="underlined"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<u>$1</u>', $text);
- $text = preg_replace('/<!-- T\[style type="(underlined,bold|bold,underlined)"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<u><b>$1</b></u>', $text);
- $text = preg_replace('/<!-- T\[style type="(underlined,italic|italic,underlined)"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<u><i>$1</i></u>', $text);
- $text = preg_replace('/<!-- T\[style type="(bold,italic|italic,bold)"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<b><i>$1</i></b>', $text);
- $text = preg_replace('/<!-- T\[style type="(bold,italic,underlined|italic,bold,underlined|underlined,italic,bold|underlined,bold,italic|bold,underlined,italic|italic,underlined,bold)"\]T -->(.*?)<!-- T\[\/style\]T -->/ius', '<u><b><i>$1</i></b></u>', $text);
- $text = preg_replace('/<!-- T\[align type="center"\]T -->(.*?)<!-- T\[\/align\]T -->/ius', '<center>$1</center>', $text);
- $text = preg_replace('/<!-- T\[align type="right"\]T -->(.*?)<!-- T\[\/align\]T -->/ius', '<right>$1</right>', $text);
- $text = strip_tags($text, '<br/><br><br /><b><i><u><center><right>');
- $fic['chapter_'.$i]['text'] = trim($text);
- $fic['length_kb'] += mb_strlen($fic['chapter_'.$i]['text']);
- $fic['length_words'] += LibStr_CountWords($fic['chapter_'.$i]['text']);
- }
- }
- $fic['chapters_count'] += 1;
- $fic['length_kb'] = ceil($fic['length_kb']/1024);
- $fic['not_russian'] = '1';
- return $fic;
- }
- // Парсинг страницы с ficbook.net
- function LibFictofile_Parse_Ficbook($content, $fic)
- {
- // Проверяю на 404
- if(mb_strpos($content, '404 — Страница не найдена') !== false)
- {
- return array('error'=>'404');
- }
- if(mb_strpos($content, 'Работа удалена') !== false)
- {
- return array('error'=>'404');
- }
- if(mb_strpos($content, 'Access denied') !== false || $fic['length'] == 0)
- {
- return array('error'=>'2');
- }
- // Достаю название и шапку
- preg_match('/<h1[^>]*>(.*?)<\/h1>(.*?)<hr\s*\/>/ius', $content, $matches);
- $fic['title'] = $matches[1];
- $fic['head'] = '<b>Ссылка:</b> '.strip_tags(trim(str_replace('<br />', '<br/>',str_replace('<br>', '<br/>',$matches[2]))), '<br/><b><i>');
- $fic['head'] = str_replace('"', '"', $fic['head']);
- $fic['head'] = str_replace("\r", '', $fic['head']);
- $fic['head'] = preg_replace("/[\n]+/u", "\n", $fic['head']);
- // Достаю направленность
- $fic['het_slash'] = 0;
- if(preg_match('/<b>Направленность:<\/b>([^<]*?)<br/ius', $fic['head'], $matches12))
- {
- switch(trim($matches12[1]))
- {
- case 'Гет': $fic['het_slash'] = 1; break;
- case 'Слэш': $fic['het_slash'] = 2; break;
- case 'Джен': $fic['het_slash'] = 3; break;
- case 'Фемслэш': $fic['het_slash'] = 4; break;
- case 'Смешанная': $fic['het_slash'] = 5; break;
- case 'Статья': $fic['het_slash'] = 6; break;
- }
- }
- // Достаю саммари
- if(preg_match('/<b>Описание:<\/b>[^<]*<br\/>(.*?)<br\/><br\/>/ius', $fic['head'], $matches1))
- {
- $fic['summary'] = trim($matches1[1]);
- }
- elseif(preg_match('/<b>Описание:<\/b>[^<]*<br\/>(.*?)$/ius', $fic['head'], $matches1))
- {
- $fic['summary'] = preg_replace('/[\s?<br\/>]+$/u', '', trim($matches1[1]));
- }
- // Достаю "от автора"
- if(preg_match('/<b>Примечания автора:<\/b>[^<]*<br\/>(.*?)(<b>|$)/ius', $fic['head'], $matches10))
- {
- $fic['author_comment'] = preg_replace('/[\s?<br\/>]+$/u', '', trim($matches10[1]));
- }
- // Достаю автора или переводчика
- $fic['authors_info'] = array();
- $fic['is_translation'] = 0;
- $fic['original_author'] = '';
- $fic['original_url'] = '';
- $matches2 = false;
- if(preg_match('/<b>Переводчик:<\/b>(.*?)\(https:\/\/ficbook\.net\/authors\/(\d+)\)/ius', $fic['head'], $matches2))
- {
- $fic['is_translation'] = 1;
- // автор оригинала
- if(preg_match('/<b>Автор:<\/b>(.*?)</ius', $fic['head'], $matches3))
- {
- $fic['original_author'] = trim($matches3[1]);
- }
- // ссылка на оригинал
- if(preg_match('/<b>Оригинальный текст:<\/b>(.*?)</ius', $fic['head'], $matches3))
- {
- $fic['original_url'] = trim($matches3[1]);
- }
- }
- else
- {
- preg_match('/<b>Автор:<\/b>(.*?)\(https:\/\/ficbook\.net\/authors\/(\d+)\)/ius', $fic['head'], $matches2);
- }
- if($matches2)
- {
- $fic['authors'] = trim(strip_tags($matches2[1]));
- $fic['authors_info'][] = array('id' => $matches2[2], 'name' => $fic['authors']);
- }
- // Достаю соавторов
- if(preg_match('/<b>Соавторы:<\/b>(.*?)</ius', $fic['head'], $matches2))
- {
- preg_match_all('/([^(]*?)\(https:\/\/ficbook\.net\/authors\/(\d+)\)/ius', $matches2[1], $matches2, PREG_SET_ORDER);
- foreach($matches2 AS $matches_tmp)
- {
- $author_name = trim(strip_tags($matches_tmp[1]));
- if (strpos($author_name, ',') === 0)
- {
- $author_name = trim(mb_substr($author_name, 1));
- }
- $fic['authors'] .= ', ' . $author_name;
- $fic['authors_info'][] = array('id' => $matches_tmp[2], 'name' => $author_name);
- }
- }
- // Достаю фандомы
- if(preg_match('/<b>Фэндом:<\/b>(.*?)<br\/>/ius', $fic['head'], $matches3))
- {
- $fic['fandoms'] = preg_replace('/\s+/u', ' ', trim($matches3[1]));
- }
- // Достаю Персонажей
- if(preg_match('/<b>Пейринг или персонажи:<\/b>(.*?)<br\/>/ius', $fic['head'], $matches4))
- {
- $fic['paring'] = trim($matches4[1]);
- }
- // Достаю рейтинг
- if(preg_match('/<b>Рейтинг:<\/b>(.*?)<br\/>/ius', $fic['head'], $matches5))
- {
- $fic['rating'] = trim($matches5[1]);
- }
- /*
- // Достаю жанр
- if(preg_match('/<b>Жанры:<\/b>(.*?)<br\/>/ius', $fic['head'], $matches6))
- {
- $fic['genre'] = preg_replace('/\s+/u', ' ', trim($matches6[1]));
- }
- // Достаю предупреждения
- if(preg_match('/<b>Предупреждения:<\/b>(.*?)<br\/>/ius', $fic['head'], $matches7))
- {
- $fic['warning'] = preg_replace('/\s+/u', ' ', trim($matches7[1]));
- }
- */
- // Достаю метки
- if(preg_match('/<b>Метки:<\/b>(.*?)<br\/>/ius', $fic['head'], $matches12))
- {
- $fic['keyword'] = preg_replace('/\s+/u', ' ', trim($matches12[1]));
- }
- // выделяю жанры и предупреждения
- $genres = LibFictofile_GenreListArray_Ficbook();
- $warnings = LibFictofile_WarningListArray_Ficbook();
- $this_keywords = explode(',', $fic['keyword']);
- $fic['keyword'] = array();
- $fic['genre'] = array();
- $fic['warning'] = array();
- foreach($this_keywords AS $tmp)
- {
- if(in_array(trim($tmp), $genres))
- {
- $fic['genre'][] = $tmp;
- }
- elseif(in_array(trim($tmp), $warnings))
- {
- $fic['warning'][] = $tmp;
- }
- else
- {
- $fic['keyword'][] = $tmp;
- }
- }
- $fic['genre'] = implode(', ', $fic['genre']);
- $fic['warning'] = implode(', ', $fic['warning']);
- $fic['keyword'] = implode(', ', $fic['keyword']);
- // Достаю размер
- if(preg_match('/<b>Размер:<\/b>(.*?),(.*?)<br\/>/ius', $fic['head'], $matches8))
- {
- $fic['size'] = trim($matches8[1]);
- switch($fic['size'])
- {
- case 'Мини': $fic['size'] = '1'; break;
- case 'Драббл': $fic['size'] = '1'; break;
- case 'Миди': $fic['size'] = '2'; break;
- case 'Макси': $fic['size'] = '3'; break;
- case 'планируется Мини': $fic['size'] = '1'; break;
- case 'планируется Драббл': $fic['size'] = '1'; break;
- case 'планируется Миди': $fic['size'] = '2'; break;
- case 'планируется Макси': $fic['size'] = '3'; break;
- }
- }
- // Достаю статус
- if(preg_match('/<b>Статус:<\/b>(.*?)<br\/>/ius', $fic['head'], $matches9))
- {
- $fic['status'] = trim($matches9[1]);
- switch($fic['status'])
- {
- case 'закончен': $fic['status'] = '1'; break;
- case 'в процессе': $fic['status'] = '2'; break;
- case 'заморожен': $fic['status'] = '3'; break;
- }
- }
- // Достаю количество частей
- preg_match('/<b>Кол-во частей:<\/b>.*?(\d+)/ius', $fic['head'], $matches2);
- $count_chapters = intval($matches2[1]);
- // Достаю разрешение на публикацию
- $fic['publ_permission'] = 0;
- if(preg_match('/<b>Публикация на других ресурсах:<\/b>[^<]*<br\/>(.*?)(<br\/>|$)/ius', $fic['head'], $matches11))
- {
- $fic['publ_permission'] = trim($matches11[1]);
- switch($fic['publ_permission'])
- {
- case 'Уточнять у автора/переводчика': $fic['publ_permission'] = '1'; break;
- case 'Запрещено в любом виде': $fic['publ_permission'] = '2'; break;
- case 'Разрешено в любом виде': $fic['publ_permission'] = '3'; break;
- case 'Разрешено только в виде ссылки': $fic['publ_permission'] = '4'; break;
- case 'Разрешено копирование текста с указанием автора/переводчика и ссылки на исходную публикацию': $fic['publ_permission'] = '5'; break;
- }
- }
- // Достаю главы
- // Если одна глава
- if($count_chapters == 1)
- {
- // пытаюсь достать единственную главу
- if(preg_match('/<div style="white-space: pre-wrap">(.*?)<hr>/ius', $content, $matches))
- {
- $fic['chapter_1']['title'] = $fic['title'];
- $fic['chapter_1']['text'] = LibFictofile_Parse_Ficbook_TextEdit($matches[1]);
- $fic['chapters_count'] = 2; // глава одна, но для цикла в ChaptersToBd надо ставить двойку
- $fic['length_kb'] = mb_strlen($fic['chapter_1']['text']);
- $fic['length_words'] = LibStr_CountWords($fic['chapter_1']['text']);
- }
- else
- {
- $tmp = explode('<div style="white-space: pre-wrap">', $content);
- $tmp = explode('<hr>', $tmp[2]);
- $fic['chapter_1']['title'] = $fic['title'];
- $fic['chapter_1']['text'] = LibFictofile_Parse_Ficbook_TextEdit($tmp[0]);
- $fic['chapters_count'] = 2; // глава одна, но для цикла в ChaptersToBd надо ставить двойку
- $fic['length_kb'] = mb_strlen($fic['chapter_1']['text']);
- $fic['length_words'] = LibStr_CountWords($fic['chapter_1']['text']);
- }
- // Достаю даты
- $fic['date_last'] = 0;
- $fic['date_first'] = 0;
- $fic['chapter_1']['date'] = 0;
- $content = LibFictofile_GetContent('https://ficbook.net/readfic/'.$fic['default_id'], true, true);
- if(preg_match('/<span title="(\d{1,2} [а-я]{3,9} \d{4}, \d{2}:\d{2}?)">/ius', $content, $matches))
- {
- $month_ru = array(' января ', ' февраля ', ' марта ', ' апреля ', ' мая ', ' июня ', ' июля ', ' августа ', ' сентября ', ' октября ', ' ноября ', ' декабря ');
- $month_en = array('-01-', '-02-', '-03-', '-04-', '-05-', '-06-', '-07-', '-08-', '-09-', '-10-', '-11-', '-12-');
- $fic['date_first'] = strtotime(str_replace($month_ru, $month_en, str_replace(',', '', $matches[1])));
- $fic['date_last'] = $fic['date_first'];
- $fic['chapter_1']['date'] = $fic['date_first'];
- }
- // достаю фандомы
- if(preg_match('/<dd>[\s]+<i class="icon-book"><\/i>[\s]+(.*?)<\/dd>/ius', $content, $matches))
- {
- if(preg_match_all('/<a href="\/fanfiction\/(.*?)">(.*?)<\/a>/ius', $matches[1], $matches1, PREG_SET_ORDER))
- {
- $count = count($matches1);
- for($i=0;$i<$count;$i++)
- {
- if($matches1[$i][2] != '') $fic['fandoms_arr'][$matches1[$i][1]] = $matches1[$i][2];
- }
- }
- }
- }
- else
- {
- $fic['length_kb'] = 0;
- $fic['length_words'] = 0;
- $content = str_replace('<hr>', '<hr/>', $content);
- $tmp = explode('<hr/>', $content);
- $tmp = explode('<h2>', $tmp[1]);
- $i = 0;
- foreach ($tmp as $tmp3)
- {
- $tmp2 = explode('</h2>', $tmp3);
- if (count($tmp2) == 1)
- {
- continue;
- }
- if ($tmp2[0] == 'Примечание к части')
- {
- if ($i == 0)
- {
- $fic['chapter_1']['text'] .= '<b>Примечание к части</b><br/>'.LibFictofile_Parse_Ficbook_TextEdit($tmp2[1]).'<br/><br/>';
- }
- else
- {
- $fic['chapter_'.$i]['text'] .= '<br/><br/><b>Примечание к части</b><br/>'.LibFictofile_Parse_Ficbook_TextEdit($tmp2[1]);
- }
- }
- else
- {
- $i++;
- $fic['chapter_'.$i]['title'] = trim(strip_tags($tmp2[0]));
- $fic['chapter_'.$i]['text'] .= LibFictofile_Parse_Ficbook_TextEdit($tmp2[1]);
- $fic['length_kb'] += mb_strlen($fic['chapter_'.$i]['text']);
- $fic['length_words'] += LibStr_CountWords($fic['chapter_'.$i]['text']);
- }
- }
- $fic['chapters_count'] = $i+1;
- // Достаю даты
- $fic['date_last'] = 0;
- $fic['date_first'] = 0;
- $content = LibFictofile_GetContent('https://ficbook.net/readfic/'.$fic['default_id'], true, true);
- $tmp = explode('<a name="part_content"></a>', $content);
- $tmp = explode('</ul>', $tmp[1]);
- if(preg_match_all('/<span title="(\d{1,2} [а-я]{3,9} \d{4}, \d{2}:\d{2}?)">/ius', $tmp[0], $matches))
- {
- $month_ru = array(' января ', ' февраля ', ' марта ', ' апреля ', ' мая ', ' июня ', ' июля ', ' августа ', ' сентября ', ' октября ', ' ноября ', ' декабря ');
- $month_en = array('-01-', '-02-', '-03-', '-04-', '-05-', '-06-', '-07-', '-08-', '-09-', '-10-', '-11-', '-12-');
- $fic['date_first'] = strtotime(str_replace($month_ru, $month_en, str_replace(',', '', $matches[1][0])));
- $fic['date_last'] = strtotime(str_replace($month_ru, $month_en, str_replace(',', '', $matches[1][count($matches[1])-1])));
- for($i = 1; $i < $fic['chapters_count']; $i++)
- {
- $fic['chapter_'.$i]['date'] = strtotime(str_replace($month_ru, $month_en, str_replace(',', '', $matches[1][$i-1])));
- }
- }
- // достаю фандомы
- if(preg_match('/<dd>[\s]+<i class="icon-book"><\/i>[\s]+(.*?)<\/dd>/ius', $content, $matches))
- {
- if(preg_match_all('/<a href="\/fanfiction\/(.*?)">(.*?)<\/a>/ius', $matches[1], $matches1, PREG_SET_ORDER))
- {
- $count = count($matches1);
- for($i=0;$i<$count;$i++)
- {
- if($matches1[$i][2] != '') $fic['fandoms_arr'][$matches1[$i][1]] = $matches1[$i][2];
- }
- }
- }
- }
- // Если нет длины фанфика или она слишком мала
- if(!isset($fic['length_kb']) || $fic['length_kb'] < 10)
- {
- return array('error'=>'1');
- }
- $fic['length_kb'] = ceil($fic['length_kb']/1024);
- return $fic;
- }
- // Парсинг страницы с fictionpress.com
- function LibFictofile_Parse_Fictionpress($content, $fic)
- {
- // Проверяю на 404
- if(mb_strpos($content, 'Unable to locate story. Code 1.') !== false)
- {
- return array('error'=>'404');
- }
- // Достаю название и шапку
- if(preg_match('/<a class=xcontrast_txt[\s]+href=\"(.*?)\">(.*?)<\/a>.*?<b class=\'xcontrast_txt\'>([^<]*?)<\/b>.*?<a class=\'xcontrast_txt\' href=\'\/u\/([\d]{1,11})\/.*?\'>(.*?)<\/a>.*?<div style=\'margin-top:2px\' class=\'xcontrast_txt\'>(.*?)<\/div>.*?Rated:[^>]*?>(.*?)<\/a>\s+-(.+?)-(.*?)<\/div>/ius', $content, $matches))
- {
- $fic['authors'] = trim($matches[5]);
- $fic['authors_info'][] = array('id' => $matches[4], 'name' => $fic['authors']);
- $fic['title'] = trim($matches[3]);
- $fic['summary'] = trim($matches[6]);
- $fic['rating'] = '';
- switch($matches[7])
- {
- case 'Fiction K':
- case 'Fiction K+':
- $fic['rating'] = 'General';
- break;
- case 'Fiction T':
- $fic['rating'] = 'PG-13';
- break;
- case 'Fiction M':
- $fic['rating'] = 'R';
- break;
- }
- if($fic['rating'] !== '')
- {
- $rating = '<b>Рейтинг:</b> '.$fic['rating'].'<br/><br/>';
- }
- $fic['genre'] = '';
- $tmp = explode('- Chapters:', $matches[9]);
- $tmp = explode('- Words:', $tmp[0]);
- $genres = LibFictofile_GenreListArray_Fanfiction();
- foreach($genres AS $genre)
- {
- if (mb_strpos($tmp[0], $genre) !== false)
- {
- $fic['genre'] = trim($tmp[0]);
- continue;
- }
- }
- if($fic['genre'] !== '')
- {
- $genre = '<b>Жанр:</b> '.$fic['genre'].'<br/><br/>';
- }
- $size = '';
- if(preg_match('/Words:\s+([0-9,]*?)\s+-/ius', $matches[9], $matches2))
- {
- $size = '<b>Размер:</b> '.declension(str_replace(',', '', $matches2[1]), 'слово,слова,слов').'<br/><br/>';
- }
- $status = '<b>Статус:</b> В процессе написания<br/><br/>';
- $fic['status'] = '2';
- if(mb_strpos($matches[9], 'Complete'))
- {
- $status = '<b>Статус:</b> Закончен<br/><br/>';
- $fic['status'] = '1';
- }
- $fic['language'] = trim($matches[8]);
- $fic['not_russian'] = '0';
- if($fic['language'] != 'Russian')
- {
- $fic['not_russian'] = '1';
- }
- $language = '<b>Язык:</b> '.$fic['language'].'<br/><br/>';
- if(preg_match('/Published: <span data-xutime=\'(\d{9,10})\'>/ius', $matches[9], $matches2))
- {
- $fic['date_first'] = $matches2[1];
- }
- if(preg_match('/Updated: <span data-xutime=\'(\d{9,10})\'>/ius', $matches[9], $matches2))
- {
- $fic['date_last'] = $matches2[1];
- }
- else
- {
- $fic['date_last'] = $fic['date_first'];
- }
- $fic['head'] = '<b>Ссылка:</b> '.$fic['pagetosave'].$fic['default_id'].'<br/><br/><b>Автор:</b> '.$fic['authors'].'<br/><br/>'.$rating.$genre.$language.$status.$size.'<b>Аннотация:</b> '.$fic['summary'];
- $fic['head'] = str_replace("\r", '', $fic['head']);
- $fic['head'] = preg_replace("/[\n]+/u", "\n", $fic['head']);
- }
- else
- {
- return array('error'=>'1');
- }
- // Достаю главы
- $fic['length_kb'] = 0;
- $fic['length_words'] = 0;
- $i = 1;
- $dom = new DOMDocument();
- @$dom->loadHTML($content);
- $xpath = new DOMXPath($dom);
- $hasChapters = $xpath->evaluate("boolean(//select[@id='chap_select'])");
- $story_chapters = $xpath->query("//select[@id='chap_select']/option");
- if ($hasChapters)
- {
- foreach ($story_chapters as $chapter)
- {
- $title = trim($chapter->nodeValue);
- if (mb_strpos($title, $i.'.') === 0)
- {
- $title = str_replace($i.'. ', '', $title);
- $fic['chapter_'.$i]['title'] = $title;
- $content1 = LibFictofile_GetContent($fic['pagetosave'].$fic['default_id'].'/'.$i.'/', true);
- $content1 = LibFictofile_GetContent_Fanfiction_Unzip($content1);
- $tmp = explode("id='storytext'>", $content1);
- $tmp = explode('</div>', $tmp[1]);
- $innerHTML = $tmp[0];
- $innerHTML = str_replace('<hr size=1 noshade>', '', $innerHTML);
- $innerHTML = preg_replace('/<p style=[\'"]text-align:center;[\'"]>(.*?)<\/p>/ius', '<br/><center>$1</center><br/>', $innerHTML);
- $innerHTML = str_replace('<br>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<p>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<P>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<em>', '<i>', $innerHTML);
- $innerHTML = str_replace('</em>', '</i>', $innerHTML);
- $innerHTML = str_replace('<strong>', '<b>', $innerHTML);
- $innerHTML = str_replace('</strong>', '</b>', $innerHTML);
- $innerHTML = str_replace("\r", '', $innerHTML);
- $innerHTML = str_replace("\n", ' ', $innerHTML);
- $innerHTML = str_replace('–', '-', $innerHTML);
- $innerHTML = strip_tags($innerHTML, '<br/><b><i><u><center><s>');
- $fic['chapter_'.$i]['text'] = $innerHTML;
- $fic['length_kb'] += mb_strlen($fic['chapter_'.$i]['text']);
- $fic['length_words'] += LibStr_CountWords($fic['chapter_'.$i]['text']);
- }
- else
- {
- break;
- }
- $i++;
- }
- $fic['chapters_count'] = $i;
- }
- // Если одна глава
- else
- {
- $fic['chapter_1']['title'] = $fic['title'];
- $tmp = explode("id='storytext'>", $content);
- $tmp = explode('</div>', $tmp[1]);
- $innerHTML = $tmp[0];
- $innerHTML = str_replace('<hr size=1 noshade>', '', $innerHTML);
- $innerHTML = preg_replace('/<p style=[\'"]text-align:center;[\'"]>(.*?)<\/p>/ius', '<br/><center>$1</center><br/>', $innerHTML);
- $innerHTML = str_replace('<br>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<p>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<P>', '<br/>', $innerHTML);
- $innerHTML = str_replace('<em>', '<i>', $innerHTML);
- $innerHTML = str_replace('</em>', '</i>', $innerHTML);
- $innerHTML = str_replace('<strong>', '<b>', $innerHTML);
- $innerHTML = str_replace('</strong>', '</b>', $innerHTML);
- $innerHTML = str_replace("\r", '', $innerHTML);
- $innerHTML = str_replace("\n", ' ', $innerHTML);
- $innerHTML = str_replace('–', '-', $innerHTML);
- $innerHTML = strip_tags($innerHTML, '<br/><b><i><u><center><s>');
- $fic['chapter_1']['text'] = $innerHTML;
- $fic['chapters_count'] = 2;
- $fic['length_kb'] = mb_strlen($fic['chapter_1']['text']);
- $fic['length_words'] = LibStr_CountWords($fic['chapter_1']['text']);
- }
- $fic['length_kb'] = ceil($fic['length_kb']/1024);
- return $fic;
- }
- // Парсинг страницы с Hogwartsnet
- function LibFictofile_Parse_Hogwartsnet($content, $fic)
- {
- // Проверяю на 404
- if(mb_strpos($content, 'Такого фанфика не существует.') !== false)
- {
- return array('error'=>'404');
- }
- // Достаю название и шапку
- if(!preg_match ('/<td valign=top><font width=70% border=1 cellpadding=2 cellspacing=0 bordercolor=#0000ff style="font-size:12px;color:#555555;font-family:Arial,sans-serif;line-height:13px;"><a href="member\.php\?l=0&id=([\d]+)" class="link1">(.*?)<\/a>[ \(.*?\)]*[ ]*<i>([^<]*)<\/i>[ ]*[<img src="\/mfanf\/images\/w00t.gif" alt="стёбный фанфик">]*[<img src="\/mfanf\/see_img\.php\?id=\d" alt="Оценка фанфика">]*[ ]*[SMS рейтинг: <font color="red"><b>\d+\.?\d?<\/b> <small>\(голосов: \d+\)<\/small><\/font>]*<br><br>[ ]*(.*?)<br>(.*?)<hr style="color:#dddddd;"><H2 align=center>(.*?)<\/H2>/ius', $content, $matches))
- {
- return array('error'=>'1');
- }
- $fic['title'] = trim($matches[6]);
- $fic['head'] = trim($matches[4]).'<br><br>'.strip_tags(trim(str_replace('<br>', '<br/>',$matches[5])), '<br/>');
- $fic['summary'] = trim($matches[4]);
- $fic['authors'] = strip_tags(trim($matches[2]));
- if(mb_strpos($fic['authors'], '(') !== false)
- {
- $tmp = explode('(', $fic['authors']);
- $fic['authors'] = $tmp[0];
- }
- $fic['authors_info'][] = array('id' => $matches[1], 'name' => $fic['authors']);
- $fic['head'] = str_replace(' ', '', $fic['head']);
- $fic['head'] = '<b>Ссылка:</b> http://www.hogwartsnet.ru/mfanf/ffshowfic.php?fid='.$fic['default_id'].'<br/><br/><b>Автор:</b> '.$fic['authors'].'<br/><br/>'.$fic['head'];
- $head_tmp = $fic['head'];
- // Достаю поля шапки
- // Форматируем по образу вывода
- $fic['head'] = preg_replace('/(<b>Автор:<\/b>[^<]*<br\/><br\/>)([^<]*<br><br>)([^<]*<br\/>)([^<]*<br\/>)/u', '$1<b>Саммари:</b>$2<b>Фандом:</b>$3<b>Персонажи:</b>$4{%}', $fic['head']);
- $flag = mb_strpos($fic['head'], '{%}');
- $head1 = mb_substr($fic['head'], 0, $flag);
- $head2 = mb_substr($fic['head'], ($flag+3));
- $head2 = str_replace('||', '<br/>', $head2);
- $head2 = preg_replace('/(Размер:|Глав:|Предупреждения:|Начало:|Последнее обновление:)/u', '<b>$1</b>', $head2);
- $tmp = explode('<br/>', $head2);
- $head2 = '<b>Жанр:</b>'.$tmp[0].'<b>Категория:</b>'.$tmp[1].'<b>Рейтинг:</b>'.$tmp[2];
- $count = count($tmp);
- for($i=3; $i<$count; $i++)
- {
- if(!preg_match('/(Прочитано:|Подписано:|Отзывов:)/u',$tmp[$i])) $head2 .= $tmp[$i];
- }
- $fic['head'] = $head1.$head2;
- $fic['head'] = str_replace(array('<br/>', '<br>'), '', $fic['head']);
- $fic['head'] = str_replace(
- array('Ссылка:', 'Примечания автора:', 'Беты (редакторы):'),
- array('Ссылка:', 'От автора:', 'Беты:'),
- $fic['head']);
- $fic['head'] = preg_replace('/<b>(.*?)<\/b>/u', '</div><div class="clear"></div></div><div class="tr"><div class="title">$1</div><div class="content">', $fic['head']).'</div><div class="clear"></div></div>';
- $fic['head'] = mb_substr($fic['head'], 37);
- // Достаю фандомы
- $fic['fandoms'] = '';
- $fic['fandoms_arr'] = array();
- if(preg_match('/Фандом:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches3))
- {
- $fic['fandoms'] = trim($matches3[1]);
- $fic['fandoms_arr'][$fic['fandoms']] = $fic['fandoms'];
- }
- // Достаю Персонажей
- $fic['paring'] = '';
- if(preg_match('/<div class="title">Персонажи:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches4))
- {
- $fic['paring'] = trim($matches4[1]);
- }
- // статус
- $fic['status'] = 0;
- switch($matches[3])
- {
- case 'закончен':
- $fic['status'] = 1;
- break;
- case 'в работе':
- $fic['status'] = 2;
- break;
- case 'заброшен':
- case 'приостановлен':
- $fic['status'] = 3;
- break;
- }
- // Достаю рейтинг
- $fic['rating'] = '';
- if(preg_match('/<div class="title">Рейтинг:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches5))
- {
- $fic['rating'] = trim($matches5[1]);
- if($fic['rating'] == '')
- {
- preg_match('/<div class="title">Категория:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches5);
- $fic['rating'] = trim($matches5[1]);
- }
- }
- // Достаю жанр
- $fic['genre'] = '';
- if(preg_match('/<div class="title">Жанр:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches6))
- {
- $fic['genre'] = preg_replace('/\/$/u', '', preg_replace('/\/+/u', '/', preg_replace('/\/\s+/u', '/', trim($matches6[1]))));
- }
- // Достаю категорию
- $fic['het_slash'] = 0;
- if(preg_match('/<div class="title">Категория:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches10))
- {
- $tmp = trim($matches10[1]);
- switch($tmp)
- {
- case 'гет':
- $fic['het_slash'] = '1';
- break;
- case 'слэш':
- $fic['het_slash'] = '2';
- break;
- case 'джен':
- $fic['het_slash'] = '3';
- break;
- case 'фемслэш':
- $fic['het_slash'] = '4';
- break;
- }
- }
- // Достаю предупреждения
- $fic['warning'] = '';
- if(preg_match('/<div class="title">Предупреждения:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches7))
- {
- $fic['warning'] = trim($matches7[1]);
- }
- // Достаю размер
- $fic['size'] = 0;
- if(preg_match('/<div class="title">Размер:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches8))
- {
- $fic['size'] = trim($matches8[1]);
- switch($fic['size'])
- {
- case 'мини': $fic['size'] = '1'; break;
- case 'миди': $fic['size'] = '2'; break;
- case 'макси': $fic['size'] = '3'; break;
- }
- }
- // Достаю даты
- $fic['date_first'] = 0;
- if(preg_match('/<div class="title">Начало:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches7))
- {
- $fic['date_first'] = trim($matches7[1]);
- $fic['date_first'] = strtotime(preg_replace('/(\d{2})\.(\d{2})\.(\d{2})/u', '20$3-$2-$1', $fic['date_first']));
- }
- if(preg_match('/<div class="title">Последнее обновление:<\/div><div class="content">(.*?)<\/div>/ius', $fic['head'], $matches7))
- {
- $fic['date_last'] = trim($matches7[1]);
- $fic['date_last'] = strtotime(preg_replace('/(\d{2})\.(\d{2})\.(\d{2})/u', '20$3-$2-$1', $fic['date_last']));
- }
- if ($fic['date_last'] == '')
- {
- $fic['date_last'] = $fic['date_first'];
- }
- /*
- if(IsAdmin())
- {
- print_r($fic);
- exit;
- }
- */
- $fic['head'] = $head_tmp;
- // иноформация о переводе
- $fic['is_translation'] = 0;
- $fic['original_author'] = '';
- $fic['original_url'] = '';
- if(preg_match('/Автор фанфика: ([^<]*)<br\/>.*?Ссылка на фанфик: ([^<]*)<br\/>/ius', $fic['head'], $matches9))
- {
- $fic['is_translation'] = 1;
- $fic['original_author'] = $matches9[1];
- $fic['original_url'] = $matches9[2];
- }
- // Достаю главы
- $fic['length_kb'] = 0;
- $fic['length_words'] = 0;
- $tmp = explode('<center><b>', $content);
- $count = count($tmp);
- if($count > 1)
- {
- for ($i = 1; $i < $count; $i++)
- {
- // Отрезаю конец последней главы
- if($i == $count-1)
- {
- $tmp2 = explode('</div>',$tmp[$i]);
- $tmp[$i] = $tmp2[0];
- }
- $tmp1 = explode('</b></center>',$tmp[$i]);
- $fic['chapter_'.$i]['title'] = trim($tmp1[0]);
- $tmp1[1] = preg_replace('/<script.*?<\/script>/ius', '', $tmp1[1]);
- $fic['chapter_'.$i]['text'] = strip_tags(str_replace('<br />', '<br/>', str_replace('<br>', '<br/>', trim($tmp1[1]))), '<br/><b><i><sup><s><center><sub>');
- $fic['length_kb'] += mb_strlen($fic['chapter_'.$i]['text']);
- $fic['length_words'] += LibStr_CountWords($fic['chapter_'.$i]['text']);
- }
- $fic['chapters_count'] = $i;
- }
- // Если главы не распарсились
- if($i == 1)
- {
- return array('error'=>'1');
- }
- $fic['length_kb'] = ceil($fic['length_kb']/1024);
- return $fic;
- }
- // Парсинг страницы с proza.ru
- function LibFictofile_Parse_Proza($content, $fic)
- {
- // Проверяю на 404
- if (mb_strpos($content, '<h1 align="center"><font color="#FF0000">') !== false)
- {
- return array('error'=>'404');
- }
- $content = mb_convert_encoding($content,"UTF-8","CP1251");
- // Достаю название
- $fic['title'] = 'Без названия';
- if(preg_match('/<h1>([^<]*?)<\/h1>/ius', $content, $matches1))
- {
- $fic['title'] = trim($matches1[1]);
- }
- // Достаю автора
- if(!preg_match('/<div class="titleauthor"><em><a href="\/avtor\/([a-zA-Z0-9_-]+?)">([^<]+?)<\/a><\/em><\/div>/ius', $content, $matches2))
- {
- return array('error'=>'1');
- }
- $fic['authors'] = trim($matches2[2]);
- $fic['authors_info'][] = array('id' => $matches2[1], 'name' => $fic['authors']);
- // даты из uri произведения
- preg_match('/^(\d{4})\/(\d{2})\/(\d{2})/', $fic['default_id'], $matches3);
- $fic['date_first'] = strtotime($matches3[1].'-'.$matches3[2].'-'.$matches3[3]);
- $fic['date_last'] = $fic['date_first'];
- $fic['summary'] = 'Нет описания';
- // Достаю главы
- $tmp = explode('<div class="text">', $content);
- $tmp = explode('</div>', $tmp[1]);
- $fic['chapter_1']['title'] = $fic['title'];
- $fic['chapter_1']['text'] = str_replace('<br>', '<br/>', $tmp[0]);
- $fic['chapter_1']['text'] = strip_tags_smart(str_replace("\r", '', str_replace("\n", ' ', $fic['chapter_1']['text'])), array("<br>", "<b>", "<i>"));
- $fic['chapters_count'] = 2;
- $fic['length_kb'] = ceil(mb_strlen($fic['chapter_1']['text'])/1000);
- $fic['length_words'] = LibStr_CountWords($fic['chapter_1']['text']);
- return $fic;
- }
- // Парсинг страницы с СИ
- function LibFictofile_Parse_Samlib($content, $fic)
- {
- // Проверяю на 404
- if (mb_strpos($content, '404 Not Found') !== false)
- {
- return array('error'=>'404');
- }
- $content = mb_convert_encoding($content,"UTF-8","CP1251");
- // Удаляю некоторую херню
- $content = str_replace('>_<', '', $content);
- // Достаю название и шапку
- if(preg_match('/<h3>(.*?):.*?<h2>(.*?)<\/h2>.*?Размещен: (\d\d\/\d\d\/\d\d\d\d?), изменен: (\d\d\/\d\d\/\d\d\d\d?).*?<li>(.*?)<li>.*?<b>Аннотация:<\/b><br><font color="#555555"><i>(.*?)<\/i><\/font><\/ul>/ius', $content, $matches))
- {
- $fic['authors'] = trim($matches[1]);
- $fic['title'] = trim($matches[2]);
- $fic['summary'] = strip_tags(trim($matches[6]), '<br/><br>');
- $fic['summary'] = str_replace(array('<br /><br />', '<br /><br /><br />', '<br /><br /><br /><br />'), '<br />', $fic['summary']);
- $fic['summary'] = preg_replace('/(^<br \/>\s*|\s*<br \/>$)/ius', '', trim($fic['summary']));
- preg_match_all('/<a href="\/janr\/.*?">(.*?)<\/a>/iu', $matches[5], $genres);
- $fic['genre'] = implode('/', $genres[1]);
- if(count($genres[1]) > 0) $genres = '<br/><br/><b>Жанры:</b> '.implode(', ', $genres[1]);
- else $genres = '';
- $fic['head'] = '<b>Ссылка:</b> '.$fic['pagetosave'].$fic['default_id'].'<br/><br/><b>Автор:</b> '.$fic['authors'].$genres.'<br/><br/><b>Аннотация:</b><br/>'.$fic['summary'].'<br/><br/><b>Размещен:</b> '.$matches[3].'<br/><br/><b>Изменен:</b> '.$matches[4];
- $fic['date_first'] = strtotime(preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/u', '$3-$2-$1', $matches[3]));
- $fic['date_last'] = strtotime(preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/u', '$3-$2-$1', $matches[4]));
- }
- elseif(preg_match('/<h3>(.*?):.*?<h2>(.*?)<\/h2>.*?Размещен: (\d\d\/\d\d\/\d\d\d\d?), изменен: (\d\d\/\d\d\/\d\d\d\d?).*?<li>(.*?)<\/ul>/ius', $content, $matches))
- {
- $fic['authors'] = trim($matches[1]);
- $fic['title'] = trim($matches[2]);
- $fic['summary'] = 'Нет описания';
- preg_match_all('/<a href="\/janr\/.*?">(.*?)<\/a>/iu', $matches[5], $genres);
- $fic['genre'] = implode('/', $genres[1]);
- if(count($genres[1]) > 0) $genres = '<br/><br/><b>Жанры:</b> '.implode(', ', $genres[1]);
- else $genres = '';
- $fic['head'] = '<b>Ссылка:</b> '.$fic['pagetosave'].$fic['default_id'].'<br/><br/><b>Автор:</b> '.$fic['authors'].$genres.'<br/><br/><b>Аннотация:</b> нет<br/><br/><b>Размещен:</b> '.$matches[3].'<br/><br/><b>Изменен:</b> '.$matches[4];
- $fic['date_first'] = strtotime(preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/u', '$3-$2-$1', $matches[3]));
- $fic['date_last'] = strtotime(preg_replace('/(\d{2})\/(\d{2})\/(\d{4})/u', '$3-$2-$1', $matches[4]));
- }
- else
- {
- return array('error'=>'1');
- }
- $tmp = explode('/', $fic['default_id']);
- $fic['authors_info'][] = array('id' => $tmp[1], 'name' => $fic['authors']);
- $fic['fandoms'] = '';
- $fic['head'] = str_replace("\r", '', $fic['head']);
- $fic['head'] = preg_replace("/[\n\s]+/u", "\n", $fic['head']);
- // Достаю главы
- $tmp = explode('<!----------- Собственно произведение --------------->', $content);
- $tmp2 = explode('<!--------------------------------------------------->', $tmp[1]);
- /*
- * добавили рекламу, количество hr стало разным, а ещё их могут использовать сами авторы
- $tmp = explode('<hr size=2 noshade>', $content);
- if(count($tmp) != 5)
- {
- return array('error'=>'1');
- }
- */
- $fic['chapter_1']['title'] = $fic['title'];
- $fic['chapter_1']['text'] = trim($tmp2[0]);
- // Обработка тэга pre
- $fic['chapter_1']['text'] = preg_replace_callback('/<pre>(.*?)<\/pre>/ius', create_function('$line','return str_replace("\n", "<br/>", $line[0]);'), $fic['chapter_1']['text']);
- $paragraph = array('</li>', '<br>', '<BR>', '<dd>', '</div>', '<p>', '<P>', '<p >');
- $fic['chapter_1']['text'] = str_replace($paragraph, '<br/>', $fic['chapter_1']['text']);
- $fic['chapter_1']['text'] = strip_tags_smart(str_replace("\r", '', str_replace("\n", ' ', $fic['chapter_1']['text'])), array("<br>", "<b>", "<i>", "<u>", "<center>", "<s>"));
- $fic['chapter_1']['text'] = str_replace('–', '—', $fic['chapter_1']['text']);
- $fic['chapter_1']['text'] = str_replace('— ', '— ', $fic['chapter_1']['text']);
- $fic['chapter_1']['text'] = str_replace('– ', '— ', $fic['chapter_1']['text']);
- $fic['chapter_1']['text'] = str_replace('—', '—', $fic['chapter_1']['text']);
- $fic['chapter_1']['text'] = str_replace('–', '—', $fic['chapter_1']['text']);
- $fic['chapter_1']['text'] = str_replace('«', '«', $fic['chapter_1']['text']);
- $fic['chapter_1']['text'] = str_replace('»', '»', $fic['chapter_1']['text']);
- $fic['chapter_1']['text'] = str_replace('…', '...', $fic['chapter_1']['text']);
- $fic['chapters_count'] = 2;
- $fic['length_kb'] = ceil(mb_strlen($fic['chapter_1']['text'])/1024);
- $fic['length_words'] = LibStr_CountWords($fic['chapter_1']['text']);
- return $fic;
- }
- // Парсинг страницы с Snapetales
- function LibFictofile_Parse_Snapetales($content, $fic)
- {
- $content = mb_convert_encoding($content, "UTF-8", "CP1251");
- // Проверяю на 404
- if (mb_strpos($content, 'Фик с таким идентификатором не существует.') !== false)
- {
- return array('error' => '404');
- }
- // Проверяю на ошибку на сайте, не стоит обновлять тексты на пустоту
- if (mb_strpos($content, 'Случилось невероятное! На сайте завелись бякоклешни и что-то своими клешнями забячили.') !== false)
- {
- return array('error' => '404');
- }
- // Достаю название и шапку
- if (!preg_match('/<h3>(.*?)<\/h3>(.*?)<a href=http:\/\/www.snapetales\.com\/index\.php\?resp_id/ius', $content, $matches))
- {
- return array('error' => '1');
- }
- $fic['title'] = trim($matches[1]);
- $fic['head'] = $matches[2];
- $head_tmp = '<b>Ссылка:</b> http://www.snapetales.com/index.php?fic_id='.$fic['default_id'].'<br/><br/>'.strip_tags(trim(preg_replace('/<td style=\'font-variant:small-caps;\'[^>]*>(.*?):<\/td><td>(.*?)<\/td>/u', '<b>$1:</b> $2<br/><br/>', str_replace('<br />', '<br/>', str_replace('<br>', '<br/>', $matches[2])))), '<br/><b><i>');
- // Достаю саммари
- if (preg_match('/<td style=\'font-variant:small-caps;\' valign=top>Аннотация:<\/td><td>(.*?)<\/td>/ius', $fic['head'], $matches1))
- {
- $fic['summary'] = trim($matches1[1]);
- }
- // Достаю от автора
- if (preg_match('/<td style=\'font-variant:small-caps;\' valign=top>Комментарии:<\/td><td>(.*?)<\/td>/ius', $fic['head'], $matches10))
- {
- $fic['author_comment'] = trim($matches10[1]);
- }
- // Достаю автора
- if (preg_match('/<td style=\'font-variant:small-caps;\'>Автор:<\/td><td>(.*?)<\/td>/ius', $fic['head'], $matches2))
- {
- $fic['authors'] = trim($matches2[1]);
- }
- // Достаю Персонажей
- if (preg_match('/<td style=\'font-variant:small-caps;\' valign=top>Персонажи:<\/td><td>(.*?)<\/td>/ius', $fic['head'], $matches4))
- {
- $fic['paring'] = trim($matches4[1]);
- }
- // Достаю рейтинг
- if (preg_match('/<td style=\'font-variant:small-caps;\'>Рейтинг:<\/td><td>(.*?)<\/td>/ius', $fic['head'], $matches5))
- {
- $fic['rating'] = trim($matches5[1]);
- }
- // Достаю жанр
- if (preg_match('/<td style=\'font-variant:small-caps;\'>Жанр:<\/td><td>(.*?)<\/td>/ius', $fic['head'], $matches6))
- {
- $fic['genre'] = preg_replace('/,\s*/u', '/', trim($matches6[1]));
- }
- // Достаю предупреждения
- if (preg_match('/<td style=\'font-variant:small-caps;\'>Предупреждения:<\/td><td>(.*?)<\/td>/ius', $fic['head'], $matches7))
- {
- $fic['warning'] = strip_tags(trim($matches7[1]), '<br><br />');
- if ($fic['warning'] == 'Tекст не требует предупреждений')
- {
- $fic['warning'] = '';
- }
- }
- // Достаю статус
- if (preg_match('/<td style=\'font-variant:small-caps;\'>Статус:<\/td><td>(.*?)<\/td>/ius', $fic['head'], $matches9))
- {
- $fic['status'] = trim($matches9[1]);
- switch ($fic['status'])
- {
- case 'Закончен':
- $fic['status'] = '1';
- break;
- case 'Не закончен':
- $fic['status'] = '2';
- break;
- case 'Замерз':
- $fic['status'] = '3';
- break;
- }
- }
- // Достаю даты
- if (preg_match('/<td style=\'font-variant:small-caps;\'>Выложен:<\/td><td>(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})(.*?)<\/td>/ius', $fic['head'], $matches11))
- {
- $fic['date_first'] = strtotime($matches11[1]);
- if (preg_match('/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/u', $matches11[2], $matches12))
- {
- $fic['date_last'] = strtotime($matches12[1]);
- }
- elseif (preg_match('/(\d{4}\.\d{2}\.\d{2} \d{2}:\d{2}:\d{2})/u', $matches11[2], $matches12))
- {
- $fic['date_last'] = strtotime(str_replace('.', '-', $matches12[1]));
- }
- elseif (preg_match('/(\d{4}\.\d{2}\.\d{2})/u', $matches11[2], $matches12))
- {
- $fic['date_last'] = strtotime(str_replace('.', '-', $matches12[1]));
- }
- else
- {
- $fic['date_last'] = $fic['date_first'];
- }
- }
- if ($fic['date_last'] == '')
- {
- $fic['date_last'] = '0';
- }
- if ($fic['date_first'] == '')
- {
- $fic['date_first'] = '0';
- }
- $fic['head'] = $head_tmp;
- $fic['head'] = str_replace("\r", '', $fic['head']);
- $fic['head'] = preg_replace("/[\n]+/u", "\n", $fic['head']);
- // Запускаем CURL
- $content2 = LibFictofile_GetContent('http://www.snapetales.com/index.php?fic_id='.$fic['default_id']);
- $content2 = mb_convert_encoding($content2, "UTF-8", "CP1251");
- $fic['authors_info'] = array();
- if (preg_match("/<td style='font-variant:small-caps;'>Автор\/-ы, переводчик\/-и:<\/td>(.*?)<\/td>/ius", $content2, $matches))
- {
- if (preg_match_all('/<a href=index\.php\?auth\_id=(\d+)>(.*?)<\/a>/ius', $matches[1], $matches_author, PREG_SET_ORDER))
- {
- foreach ($matches_author AS $tmp)
- {
- $fic['authors_info'][] = array('id' => $tmp[1], 'name' => $tmp[2]);
- }
- }
- }
- $fic['fandoms_arr'] = array();
- if (preg_match("/<td style='font-variant:small-caps;'>Фандом:<\/td>(.*?)<\/td>/ius", $content2, $matches))
- {
- if (preg_match_all('/<a href=index\.php\?id=3&x\_id=(\d+)[^>]*?>(.*?)<\/a>/ius', $matches[1], $matches_fandom, PREG_SET_ORDER))
- {
- foreach ($matches_fandom AS $tmp)
- {
- $fic['fandoms_arr'][$tmp[1]] = $tmp[2];
- }
- }
- }
- // иноформация о переводе
- $fic['is_translation'] = 0;
- $fic['original_author'] = '';
- $fic['original_url'] = '';
- if (preg_match('/>Ссылка на оригинал:<\/td><td>.*?<a href="([^"]*?)"/ius', $content2, $matches_trl))
- {
- $fic['is_translation'] = 1;
- $fic['original_author'] = $fic['authors_info'][0]['name'];
- unset($fic['authors_info'][0]);
- $fic['original_url'] = $matches_trl[1];
- $fic['original_url'] = str_replace('?view_adult=true', '', $fic['original_url']);
- }
- $fic['length_kb'] = 0;
- $fic['length_words'] = 0;
- // Достаю главы
- $content = preg_replace('/<strong>Данный материал может содержать сцены насилия, описание однополых связей и других НЕДЕТСКИХ отношений\.[\s]*<br>Я предупрежден\(-а\) и осознаю, что делаю, читая нижеизложенный текст\/просматривая видео\.<\/strong>/ius', '', $content);
- $tmp = explode('<strong>', $content);
- $count = count($tmp);
- if ($count > 1)
- {
- for ($i = 1; $i < $count; $i++)
- {
- $tmp1 = explode('</strong>', $tmp[$i]);
- $fic['chapter_'.$i]['title'] = trim($tmp1[0]);
- $fic['chapter_'.$i]['text'] = strip_tags(str_replace('<br />', '<br/>', str_replace('<br>', '<br/>', trim($tmp1[1]))), '<br/><b><i><sup><s><center><sub>');
- $fic['length_kb'] += mb_strlen($fic['chapter_'.$i]['text']);
- $fic['length_words'] += LibStr_CountWords($fic['chapter_'.$i]['text']);
- }
- $fic['chapters_count'] = $i;
- }
- else
- {
- // пытаюсь достать единственную главу
- $tmp = explode('<tr bgcolor="#FFFBE5" align=justify><td>', $content);
- $tmp = explode('</td>', $tmp[1]);
- if (mb_strlen($tmp[0]) > 100)
- {
- $fic['chapter_1']['title'] = $fic['title'];
- $fic['chapter_1']['text'] = trim($tmp[0]);
- $fic['chapter_1']['text'] = strip_tags(str_replace('<br />', '<br/>', str_replace('<br>', '<br/>', $fic['chapter_1']['text'])), '<br/><b><i><sup><s><center><sub>');
- $fic['chapters_count'] = 2; // глава одна, но для цикла, который будет позже, надо ставить двойку
- $fic['length_kb'] = mb_strlen($fic['chapter_1']['text']);
- $fic['length_words'] = LibStr_CountWords($fic['chapter_1']['text']);
- }
- else
- {
- return array('error' => '1');
- }
- }
- $fic['length_kb'] = ceil($fic['length_kb'] / 1024);
- return $fic;
- }
Advertisement
Add Comment
Please, Sign In to add comment