是否正确使用 \n 来检测新的换行符?我知道有些系统使用\n,其他的\r\n 和其他的\r,但\n 是最常见的。
这取决于数据的来源。不同的操作系统有不同的换行符。
Windows 使用\r\n
,*nix(包括 mac OS)使用\n
,(非常)旧的 mac 使用\r
。如果数据来自网络(例如文本区域),它将(/应该)始终是\r\n
. 因为这是规范规定用户代理应该做的事情。
有时,如果最后有一个像“(引号)这样的 HTML 实体,它会保留为 ",因此它不是有效的 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.');