【问题标题】:Wrap text every 2500 characters in a <div> for pagination using PHP or javascript使用 PHP 或 javascript 在 <div> 中每 2500 个字符换行一次以进行分页
【发布时间】:2012-06-30 20:44:02
【问题描述】:

我有一大段文字。我想将此文本的每 2500 个字符包装成一个&lt;div&gt;,这样我就可以对其进行分页。

以下不起作用:

//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

显然我需要关闭 &lt;/div&gt; 标记来完成这项工作。

有没有人在 PHP 或 Javascript/jQuery 中对此提出建议?

【问题讨论】:

    标签: php javascript jquery pagination word-wrap


    【解决方案1】:

    然后添加&lt;/div&gt;

    $text = '<div class="individualPage">'
          . wordwrap($text, 5, '</div><div class="individualPage">')
          . '</div>';
    

    但是,您可以使用 javascript 做得更好:您可以 paginate in response to the viewer's screen size

    只需将您的 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,则提供向后兼容性。

    【讨论】:

    • 嗨@Eric,谢谢你,你会碰巧知道javascript解决方案吗?
    • @timpeterson:javascript 没有内置的自动换行。您是否关心字符数,或者您实际上是否在乎垂直高度?
    • @Eric,我想我不确定我是否关心字符或垂直高度。我猜任何看起来最“自然”的东西,意思是最接近复制实体书中页面的东西。您有可以分享的垂直高度解决方案吗?
    • @timpeterson: here's 调整窗口大小时重新分页的版本!
    • @Eric,太酷了。我感觉很糟糕,我希望我能接受你和 -@Peter 的回答。如果此链接来自其他一些 SO 答案,如果您愿意分享该链接,我将很乐意支持。
    【解决方案2】:

    这就是我的做法:

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

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

    【讨论】:

    • 这会破坏单词,不像wordwrap
    • 啊,不知道。感谢您的信息。
    【解决方案3】:

    只需在开头添加一个开始 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>";
    

    【讨论】:

    • 嗨@Peter,谢谢你,你会碰巧知道javascript解决方案吗?
    • @Eric 我不确定我是否明白为什么您链接的答案会比这个有更好的性能;它们看起来几乎一模一样,真的。
    • @PeterOlson:我在您编辑之前发表了该评论 - 我们的答案过去是相同的,但我先发布了。
    • @PeterOlson,非常感谢!看起来您的 Javascript 解决方案会减少单词,所以如果两者都可用,您的 PHP 解决方案似乎更胜一筹,是/否?
    • @timpeterson:如果您想基于自动换行和字符进行分页,请使用 PHP。如果你想在一个固定的高度上分页,你可以用 javascript 做得更好
    【解决方案4】:

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

    【讨论】:

    • 不错!我认为您可以将(?!.) 替换为$
    • 超过 20 个字符的单词失败
    • 不 - 这是一个多行正则表达式 - $ 匹配行尾。 JavaScript 没有其他一些语言所拥有的\Z
    • 这个更简单的正则表达式似乎对我有用:/(.|\n){1,2500}(\b|$)/mg。我错过了什么吗?
    • @Eric:很好,那个更简单的正则表达式似乎确实有效(尽管它有时会创建少于 2500 个字符的部分)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多