预览长文本

时间:2012-06-23 22:59:07

标签: php html string text newline

我在PHP工作,我想创建一个函数,给定一个任意长度和高度的文本,返回相同文本的限制版本,最多500个字符和10行。< / p>

这是我到目前为止所做的:

function preview($str)
{
    $partialPreview = explode("\n", substr($str, 0, 500));
    $partialPreviewHeight = count($partialPreview);
    $finalPreview = "";

    // if it has more than 10 lines
    if ($partialPreviewHeight > 10) {
        for ($i = 0; $i < 10; $i++) {
            $finalPreview .= $partialPreview[$i];
        }
    } else {
        $finalPreview = substr($str, 0, 500);
    }

    return $finalPreview;
}

我有两个问题:

  • 是否正确使用\n来检测新的换行符?我知道一些 系统使用\n,其他\r\n和其他\r,但\n最多 常见的。
  • 有时候,如果有一个像&quot;(引号)这样的HTML实体 最后,它保留为&quot,因此它不是有效的HTML。怎么样 我可以阻止这个吗?

2 个答案:

答案 0 :(得分:1)

首先用<br /><br />\n</p><p>分别用</div><div></p>\n<p>替换</div>\n<div>代码。

然后使用strip tags的PHP函数,它应该产生一个漂亮的纯文本,在换行符的每个地方都应该有换行符。

然后,您可以将\r\n替换为\n以保持一致性。只有在那之后你才能提取所需的文本长度。

您可能希望使用word wrapping来实现10行目标。要使单词换行工作,你需要为每行定义一些字符,并且单词换行注意不要制作中间字。

您可能希望在使用wordwrap之前使用html_entity_decode作为@PeeHaa建议。

答案 1 :(得分:0)

  

是否正确使用\ n来检测新的换行符?我知道有些系统使用\ n,其他\ r \ n和其他\ r \ n,但是\ n是最常见的。

这取决于数据的来源。不同的操作系统有不同的换行符。

Windows使用\r\n,* nix(包括mac OS)使用\n,(非常)旧的mac使用\r。如果数据来自网络(例如textarea),它将(/应该)始终为\r\n。因为那是the spec陈述user agents should do

  

有时候,如果最后有一个像“(引号)”这样的HTML实体,它会保留为&amp; quot,因此它不是有效的HTML。我怎样才能防止这种情况?

在剪切文本之前,您可能希望将html实体转换回普通文本。根据您的需要使用htmlspecialchars_decode()html_entity_decode。现在你不会有破坏实体的问题(如果需要,不要忘记再次编码)。

另一种选择是仅在空格字符上打破文本而不是硬字符限制。这样,您的“摘要”中只会包含整个单词。

我创建了一个应该解决大多数问题的课程。正如我已经说过的,当数据来自textarea时,它总是\r\n,但为了能够解析其他换行符,我提出了类似以下内容(未经测试):

class Preview
{
    protected $maxCharacters;
    protected $maxLines;
    protected $encoding;
    protected $lineBreaks;

    public function __construct($maxCharacters = 500, $maxLines = 10, $encoding = 'UTF-8', array $lineBreaks = array("\r\n", "\r", "\n"))
    {
        $this->maxCharacters = $maxCharacters;
        $this->maxLines = $maxLines;
        $this->encoding = $encoding;
        $this->lineBreaks = $lineBreaks;
    }

    public function makePreview($text)
    {
        $text = $this->normalizeLinebreaks($text);

        // this prevents the breaking of the &quote; etc
        $text = html_entity_decode($text, ENT_QUOTES, $this->encoding);

        $text = $this->limitLines($text);

        if (mb_strlen($text, $this->encoding) > $this->maxCharacters) {
            $text = $this->limitCharacters($text);
        }

        return html_entity_decode($text, ENT_QUOTES, $this->encoding);
    }

    protected function normalizeLinebreaks($text)
    {
        return str_replace($lineBreaks, "\n", $text);
    }

    protected function limitLines($text)
    {
        $lines = explode("\n", $text);
        $limitedLines = array_slice($lines, 0, $this->maxLines);

        return implode("\n", $limitedLines);
    }

    protected function limitCharacters($text)
    {
        return substr($text, 0, $this->maxCharacters);
    }
}

$preview = new Preview();
echo $preview->makePreview('Some text which will be turned into a preview.');