3

我有一大段文字。我想将此文本的每 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 中有这方面的建议?

4

4 回答 4

5

只需添加</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,则提供向后兼容性。

于 2012-06-30T20:50:26.923 回答
1

这就是我这样做的方式:

$out = '';
$text = str_split($text, 2500);
foreach($text as $t){
    $out .= "<div class='individualPage'>".$t."</div>";
}
echo $out;

编辑:这会将单词分开,所以坚持使用wordwrap(). :D

于 2012-06-30T20:50:25.513 回答
1

只需在开头添加一个开始 div,在末尾添加一个关闭 div,并在每次迭代开始时添加一个关闭 div。

$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>";
于 2012-06-30T20:51:34.080 回答
1

只是为了好玩 - 这是一个相当丑陋的 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

于 2012-06-30T21:35:49.800 回答