我在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
最多
常见的。"
(引号)这样的HTML实体
最后,它保留为"
,因此它不是有效的HTML。怎么样
我可以阻止这个吗?答案 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 "e; 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.');