1

PHPを使用して、 Markdownを使用してページにリッチコンテンツをレンダリングしています。\r\n簡単なバージョンの場合、2番目の段落まで、または技術的には2つが交差した後、コンテンツを切り捨てても問題ないと思います。だから私はこのコードを使用しました:

substr($content, 0, strpos($content, "\r\n\r\n", strpos($content, "\r\n\r\n") + 1));

のカウント\r\nはハードコーディングされており、奇妙な方法で計算されるため(最初の位置などの後に+1を使用)limitContent($content, $lines = 2) 、行数を言う関数を作成するためのより良い方法があります。$linesパラメータは、デフォルトのように、2行に切り捨てられますか?

私の現在のコードは次のとおりです。

/**
 * Break down the content of Markdown upto 2 breaks. 
 * @param string Markdown String
 * @return string Markdown String upto 2 breaks
 */
function limitContent($content)
{
    return substr($content, 0, strpos($content, "\r\n\r\n", strpos($content, "\r\n\r\n") + 1));
}

前もって感謝します。

4

3 に答える 3

1

あなたはそのために使うことができますexplode()

join("\r\n", array_slice(explode("\r\n\r\n", $content, $lines + 1), 0, $lines));

または同様に、preg_split()-を使用してLFとCRLFの両方を照合します。

join("\r\n", array_slice(preg_split("/(?:\r?\n){2}/", $content, $lines), 0, $lines));

ただし、最後の一致後のコンテンツ全体が最後の配列要素にコピーされるため、上記のソリューションはメモリ効率があまり高くありません。

strtok()これはメモリ効率が高い可能性があるため、使用することもできます。

$result = '';
for ($i = 0, $tok = strtok($s, "\r\n\r\n"); false !== $tok && $i < $lines; ++$i, $tok = strtok("\r\n\r\n")) {
        $result .= $t . PHP_EOL;
}
于 2012-08-29T07:41:52.947 に答える
1

わかりました、私は誤解しました。これは、あなたの望むことですか?

function limitContent($content, $lines=2)
{
    $tmp=explode("\r\n\r\n", $content);
    $tmp=array_slice($tmp,0,$lines);
    return implode("\r\n", $tmp);
}

[編集]そして少し良いでしょう:

function limitContent($content, $lines=2)
    {
        $tmp=explode("\r\n\r\n", $content, $lines+1);
        unset($tmp[$lines]);
        return implode("\r\n", $tmp);
    }
于 2012-08-29T08:39:34.180 に答える
1

Ninの回答では、両方のオプションのパフォーマンスの違いに興味があったので、手元にあるいくつかのデータを使用して簡単なチェックを開始しました。私は2つの文字列に対してテストしました:多くの段落を持つ長い文字列と2つの段落を持つ1つの長い文字列。

Option 214 times faster最初の文字列と2番目の文字列にあることが6% fasterわかります。したがって、これは最初の文字列に大きな利点があります。

さらに、Praveen Kumarの最初のアイデアを単純なループベースのバージョンに変換し、テストしました。

function limitContent($content, $lines=2) {
    $pos = -1;
    for ($i = 0; $i < $lines; $i++) {
        $pos = strpos($content, "\r\n\r\n", $pos+1);
        if ($pos === false) return $content;
    }
    return substr($content, 0, $pos);
}

178 times fasterこのバージョンは、最初の文字列で別のバージョンであり、2番目の文字列で別のバージョンであることが判明しました25 times faster。これらの数値は、データとphpのバージョンによって大きく変わる可能性がありますが、配列への変換とその逆の変換が遅いことを明確に示していると思います。パフォーマンスが問題にならない場合は、読むのが非常に簡単なので、おそらくNinのアイデアを使用します。

于 2017-01-05T11:16:01.563 に答える