[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Код парсинга Fb2
kasper_15
Извините если ошибся разделом, я тут новичок еще. У меня есть код, взял с сайта ссылка в коде, эта программа работает впринципи именно так как мне необходимо. За одним исключением. Вот код:


<?

/**
*
*
http://conferdigit.ru/page/model-dlja-parsinga-fb2-na-php#comment-24
*/
// ------------------------------------------------------------------------


class fictionbook{
var $book;
var $table_of_content = array();
var $book_info = array();

function book_load ($file){
$this->book = simplexml_load_file ($file);
$this->title_info();
}

function title_info (){
$title_info = 'title-info';
// include ('ru-ru.php'); что это за файл должен был быть, незнаю
foreach ($this->book->description->$title_info->children() as $key=>$children){
switch ($key){
case 'genre':
$this->book_info['genre'][] = $genre_table_ru[(string) $children]; break;
case 'book-title':
$this->book_info['book-title'] = $children; break;
case 'author': //Автор(ы) произведения
$last_name = 'last-name';
$first_name = 'first-name';
$middle_name = 'middle-name';
$home_page = 'home-page';
$this->book_info['author'][] = array ( 'first-name'=>$children->$first_name,
'middle-name'=>$children->$middle_name,
'last-name'=>$children->$last_name,
'home-page'=>$children->$home_page,
'email'=>$children->email);
break;
case 'annotation':
$this->book_info['annotation'] = $children->asXML(); break;
case 'coverpage':
$this->book_info['coverpage'] = $children->image; break;
case 'date': // хранит дату создания документа.
$this->book_info['date'] = $children; break;
case 'translator': //Переводчик(и)
$last_name = 'last-name';
$first_name = 'first-name';
$middle_name = 'middle-name';
$home_page = 'home-page';
$this->book_info['translator'][] = array ( 'first-name'=>$children->$first_name,
'middle-name'=>$children->$middle_name,
'last-name'=>$children->$last_name,
'home-page'=>$children->$home_page,
'email'=>$children->email);
break;
case 'lang': //Язык книги
$this->book_info['lang'] = $children; break;
case 'year': // год издания книги.
$this->book_info['year'] = $children; break;

}
}

$this->table_of_content = $this->table_of_content();
}
// Выводит картинку
function print_image ($image){
print_r($image);
$image = $image->asXML();
preg_match("/[\"|\']\#([\S]+\.[\S]+)[\"|\']/i", $image, $image_name);
$image_name = $image_name[1];
foreach ($this->book->binary as $binary){
if ($binary[id] == $image_name){
$image = base64_decode($binary);
$file = fopen($image_name, 'w');
fwrite($file, $image);
fclose($file);
echo '<img src='.$image_name.' alt="">';

}
}
}

// Выводит title в тексте
function table_of_content($book='false'){ //Надо было как-то отметить, что в начале читать с самого начала, при этом не задавая это явно в методе.
if (!empty($this->table_of_content)){return $this->table_of_content;} //Проверка на наличие
if ($book == 'false'){$book = $this->book->body;}
foreach ($book as $key=>$body){
if (isset($body->title)){
$title = $this->__clear_string($body->title->asXML());
if (!empty($title)){
//echo '<div'.$i.'>'.$title.'</div'.$i.'>
//';

$title_array[] = $title;
}
}

$title_array_temp = $this->table_of_content($body->section);
if (!empty($title_array_temp)){$title_array[] = $title_array_temp;}
}

return $title_array;
}

function content($book='false', $i=-1){
if ($book == 'false'){$book = $this->book->body;}
++$i;
foreach ($book->children() as $key=>$body){
switch ($key){
case 'image':
$this->print_image ($body);
break;
case 'title':
if ($i == 0){$i=1;}
$title = $this->__clear_string($body->asXML());
echo '
<a name="'
.$title.'"><h'.$i.'>'.$title.'</h'.$i.'></a>
'
;
break;
case 'section':
$this->content($body, $i);
break;
case 'epigraph':
echo '<div class="epigraph">'.$this->__clear_string($body->asXML()).'</div>';
break;
default:
echo $this->__clear_string($body->asXML(), false);
}
}
}


function print_table_of_content($table = false){
if (!$table){$table = $this->table_of_content;
}
echo '<ul>';
foreach ($table as $row){
if (is_array($row)){
$this->print_table_of_content($row);
}else{
echo '<li><a href="#'.$row.'">'.$row.'</a></li>
'
;
}
}

echo '</ul>
'
;
}

private function __clear_string ($string, $p = true){
$string = preg_replace('/\<title\>|\<\/title\>/im', '', $string);
$string = preg_replace('/\s+/m', " ", $string);
$string = preg_replace('/^\s+|\s+$/', '', $string);
if ($p)
{$string = preg_replace('/\<p\>|\<\/p\>/im','', $string);

}

return $string;

}

}

$book = new fictionbook;
$book->book_load(book.fb2); // загрузка книги
//echo '<pre>';

$book->print_table_of_content();
$book->content();
?>


файл include ('ru-ru.php'); что это должно было быть, незнаю, но у автора файл указан.

Вопрос вот в чем, как вывести картинку в книге (невыводится так как) и как после тега </p> установить перенос строки, но не <br> а именно перенос строки. Вот пример как вывод книги выглядит.


<ul><li><a href="#Айзек Азимов Я, робот">Айзек Азимов Я, робот</a></li>
<ul><li><a
href="#«…Вставьте шплинт А в гнездо Б…»">«…Вставьте шплинт А в гнездо Б…»</a></li>
<li><a
href="#Часть 1. Я, робот">Часть 1. Я, робот</a></li>
<ul><li><a
href="#Лучший друг мальчика">Лучший друг мальчика</a></li>
<li><a
href="#Робби">Робби</a></li>
<li><a
href="#Робот ЭЛ-76 попадает не туда">Робот ЭЛ-76 попадает не туда</a></li>
<li><a
href="#Кэл">Кэл</a></li>
<li><a
href="#Салли">Салли</a></li>
<li><a
href="#Мечты роботов">Мечты роботов</a></li>
</ul>
<a
name="Айзек Азимов Я, робот"><h1>Айзек Азимов Я, робот</h1></a>

<a
name="«…Вставьте шплинт А в гнездо Б…»"><h2>«…Вставьте шплинт А в гнездо Б…»</h2></a>
<p>
здесь абзац</p><p>абзац</p><p>абзац</p><p>абзац</p><p>абзац</p>


По сути все абзацы в массиве являются одной строкой до начала следующей главы и проблема в том что если вывести одну строку, другим небольшим скриптом, то выведет он целую главу. А если бы установить перенос строки типа /n то смогу выводить построчно, то есть каждый абзац станет новой строкой в массиве.

--
Вот как хотелось бы вывод получить, хотя бы и без картинки. Пока не хватает знаний это сделать, пробовал по разному методом тыка, не выходит. :( Всегда выходит в одну строку.. Мне кажется местные умы, легко могут разобраться. Видимо нужна так называемая регулярка где-то? Подскажите пожалуйста.

<ul><li><a href="#Айзек Азимов Я, робот">Айзек Азимов Я, робот</a></li>
<ul><li><a
href="#«…Вставьте шплинт А в гнездо Б…»">«…Вставьте шплинт А в гнездо Б…»</a></li>
<li><a
href="#Часть 1. Я, робот">Часть 1. Я, робот</a></li>
<ul><li><a
href="#Лучший друг мальчика">Лучший друг мальчика</a></li>
<li><a
href="#Робби">Робби</a></li>
<li><a
href="#Робот ЭЛ-76 попадает не туда">Робот ЭЛ-76 попадает не туда</a></li>
<li><a
href="#Кэл">Кэл</a></li>
<li><a
href="#Салли">Салли</a></li>
<li><a
href="#Мечты роботов">Мечты роботов</a></li>
</ul>
<a
name="Айзек Азимов Я, робот"><h1>Айзек Азимов Я, робот</h1></a>

<a
name="«…Вставьте шплинт А в гнездо Б…»"><h2>«…Вставьте шплинт А в гнездо Б…»</h2></a>
<p>
здесь абзац</p>
<p>
абзац</p>
<p>
абзац</p>
<p>
абзац</p>
<p>
абзац</p>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.