У меня длинный блок текста. Я хотел бы обернуть каждые 2500 символов этого текста в <div>
, чтобы я мог рисовать страницы.
Не работает следующее:
//replace 2500 for 5 for purpose of this example $text="sfdkjas;fakska;ldjk"; $text=wordwrap($text, 5, '<div class="individualPage">');
вывод:
sfdkj<div class="individualPage">as;fa<div class="individualPage">kska;l<div class="individualPage">djk
Очевидно, мне нужен закрывающий </div>
чтобы сделать эту работу.
У кого-нибудь есть предложение для этого в PHP или Javascript / jQuery?
Просто добавьте </div>
?
$text = '<div class="individualPage">' . wordwrap($text, 5, '</div><div class="individualPage">') . '</div>';
Однако вы можете сделать еще лучше с javascript: вы можете разбивать на страницы в зависимости от размера экрана зрителя .
Просто установите для своего HTML:
<div id="target">...</div>
Добавьте некоторые CSS для страниц:
#target { white-space: pre-wrap; /* respect line breaks */ } .individualPage { border: 1px solid black; padding: 5px; }
И затем используйте следующий код:
var contentBox = $('#target'); //get the text as an array of word-like things var words = contentBox.text().split(' '); function paginate() { //create a div to build the pages in var newPage = $('<div class="individualPage" />'); contentBox.empty().append(newPage); //start off with no page text var pageText = null; for(var i = 0; i < words.length; i++) { //add the next word to the pageText var betterPageText = pageText ? pageText + ' ' + words[i] : words[i]; newPage.text(betterPageText); //Check if the page is too long if(newPage.height() > $(window).height()) { //revert the text newPage.text(pageText); //and insert a copy of the page at the start of the document newPage.clone().insertBefore(newPage); //start a new page pageText = null; } else { //this longer text still fits pageText = betterPageText; } } } $(window).resize(paginate).resize();
Это будет работать вместе с решением PHP, обеспечивая обратную совместимость, если javascript отключен.
Так я бы это сделал:
$out = ''; $text = str_split($text, 2500); foreach($text as $t){ $out .= "<div class='individualPage'>".$t."</div>"; } echo $out;
EDIT: Это сломает слова, поэтому придерживайтесь wordwrap()
. : D
Просто добавьте начальный div в начале, закрывающий div в конце и закрывающие divs в начале каждой итерации.
$div = '<div class="individualPage">'; $text = $div . wordwrap($text, 5, "</div>$div") . '</div>';
В Javascript не так хорошо построено решение.
var s = text, div = "<div class='individualPage'>"; while(text.length > 5) { s = text.slice(0, 5) + "</div>" + div; text = text.slice(5); } s = div + s + "</div>";
Просто для удовольствия – вот довольно уродливый JavaScript RegExp, который будет разбивать текст и стараться не сломать слова. Я не уверен, насколько хорошо он будет работать на огромном количестве текста.
var text = .... // Grab 2500 (or slightly more if it doesn't exactly end on a word boundary) // characters, or less than 2500 if it's at the end of the string. text = text.replace(/(((.|\n){2500,2520}?\b)|((.|\n){1,2499}(?!.)))/mg, '<div class="individual-page">$1</div>')
jsFiddle