0

私はPHPで作業しており、任意の長さと高さのテキストを指定して、最大 500 文字と 10 行の同じテキストの制限付きバージョンを返す関数を作成したいと考えています。

これは私がこれまでに持っているものです:

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;
}

2 つの質問があります。

  • \n新しい改行を検出するために適切に使用していますか? \n、 other 、 other\r\nを使用するシステムがあることは知っています\r\n、最も一般的なのは です。
  • &quot;末尾に (引用符) のような HTML エンティティがあると、そのまま残され&quot、有効な HTML ではない場合があります。どうすればこれを防ぐことができますか?
4

2 に答える 2

1

<br />まず、タグをand<br />\nまたは</p><p>andにそれぞれ置き換えます。</div><div></p>\n<p></div>\n<div>

次に、ストリップ タグに PHP 関数を使用します。これにより、改行が必要なすべての場所に改行が含まれるプレーン テキストが生成されます。

次に、一貫性のため\r\nにに置き換えることができます。\nその後、必要な長さのテキストを抽出できます。

ワード ラッピングを使用して、10 行の目標を達成することができます。ワード ラップを機能させるには、1 行あたりの文字数を定義する必要があり、ワード ラップは単語の途中で中断しないように処理します。

@PeeHaa が提案したように、wordwrap を使用する前にhtml_entity_decodeを使用することをお勧めします。

于 2012-06-23T23:09:17.920 に答える
0

新しい改行を検出するために \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 &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.');
于 2012-06-23T23:09:09.427 に答える