基于字符的分页 - 在文本上插入分页符,而不是标点符号或代码

时间:2008-12-11 11:29:13

标签: php

我正在编写代码来生成基于字符的分页。我的网站上有文章要根据篇幅分开。

到目前为止,我所使用的代码虽然有两个问题:

  1. 它在单词和HTML标签的中间拆分页面;我想要它 仅在完整的单词,标签或标点符号后分割。
  2. 在分页栏中,它生成错误的页数。
  3. 在     分页栏,它正在产生     错误的页数。

    需要帮助解决这两个问题。代码如下:

    $text = file_get_contents($View);
    $ArticleLength = strlen($text);
    $CharsPerPage = 5000;
    $NoOfPages = round((double)$ArticleLength / (double)$CharsPerPage);
    $CurrentPage = $this->ReturnNeededObject('pagenumber');
    $Page = (isset($CurrentPage) && '' !== $CurrentPage) ? $CurrentPage : '1';
    $PageText = substr($text, $CharsPerPage*($Page-1), $CharsPerPage);
    echo $PageText, '<p>';
    for ($i=1; $i<$NoOfPages+1; $i++)
    {
        if ($i == $CurrentPage)
        {
            echo '<strong>', $i, '</strong>';
        }
        else
        {
             echo '<a href="', $i, '">', $i, '</a>';
        }
        echo ' | ';
    }
    echo '</p>';
    

    我做错了什么?

4 个答案:

答案 0 :(得分:1)

谢谢,伙计们。我为第一点进行了修复,并且效果很好。

嗯。我想第二点是很麻烦的。我在网上发现了一些正则表达式。当我取得一些进展时,会思考,写作并回复你。

再次感谢。

答案 1 :(得分:0)

$NoOfPages = round((double)$ArticleLength / (double)$CharsPerPage);

那应该使用ceil而不是round - 如果你使用round,4.2页只显示1-4 - 你需要第5页来显示页面的最后.2。

另一部分更难...它常见的是在文件中使用某种标记来指示分页的位置,无论你的代码多么聪明,它都无法理解哪里是一个好的中断然后同样的人类的方式。

如果您坚持这样做,建议在创建分页符时首先向前/向后转到最近空间的逻辑,这不是太棘手。更棘手的是决定你什么时候在标签内......认为你要么需要一些相当重的正则表达式,要么就是一个HTML解析工具。

答案 2 :(得分:0)

您正在计算错误的页数...您应该使用ceil()而不是round()(例如,4.1页的文本仍然是5页要显示)。

要解决另一个问题,如果那里有任意HTML,你就会遇到大问题。例如,您需要知道<div><p>可以拆分,但<table>不是(除非您想要真正看中)!

要正确地执行此操作,您应该使用HTML库来构建元素树,然后从那里开始。

答案 3 :(得分:0)

根据您的第一个陈述,

  

它在单词和HTML标签的中间分割页面

在插入标记后,您的字符数似乎正在完成。这意味着,例如链接中的长URL将计入您尝试实现的页面长度。但是,您没有说明最初是如何创建文章的。

我建议在创建文章的过程中寻找一个可以检查原始文本的点。通过将实际内容(没有标记)视为一组段落,并根据每行的典型字符数估计每个段落的垂直长度,您可以得出更一致的大小。

我还会考虑在段落间断开,以便将思想单元放在同一页面上。作为读者,我真的很讨厌去网站,迫使我暂停,点击按钮或链接,等待页面重新加载,所有这一切都在一个想法的中间。