Оберните текст каждые 2500 символов в <div> для разбивки на страницы, используя PHP или javascript

У меня длинный блок текста. Я хотел бы обернуть каждые 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