新しい改行を検出するために \n を使用するのは適切ですか? \n を使用するシステム、\r\n を使用するシステム、\r を使用するシステムがあることは知っていますが、\n が最も一般的です。
データがどこから来ているかによって異なります。オペレーティング システムが異なれば、改行も異なります。
Windows は を使用し\r\n
、*nix (Mac OS を含む) は を使用し\n
、(非常に) 古い mac は使用し\r
ます。データが Web (テキストエリアなど) からのものである場合、常に\r\n
. それは仕様がユーザー エージェントがすべきことだと述べているからです。
末尾に " (引用符) のような HTML エンティティがあると、" のままで、有効な HTML ではない場合があります。これを防ぐにはどうすればよいですか?
テキストを切り取る前に、html エンティティを通常のテキストに戻すことができます。必要に応じて、またはいずれhtmlspecialchars_decode()
かを使用html_entity_decode
します。これで、エンティティが壊れるという問題はなくなります (必要に応じて再度エンコードすることを忘れないでください)。
別のオプションは、厳しい文字制限ではなく、空白文字でのみテキストを分割することです。このようにして、「要約」には単語全体のみが含まれます。
ほとんどの問題に対処するクラスを作成しました。すでに述べたように、データがテキストエリアからのものである場合は常に になりますが\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.');