簡體   English   中英

需要一種可擴展的方法來通過在PHP中使用substr()和strpos()來限制內容

[英]Need a scalable way to Limit Content by using substr() and strpos() in PHP

我正在使用Markdown使用PHP在頁面上呈現豐富的內容。 對於簡短版本,我認為可以將內容截斷到第二段,或者技術上,在兩個\\r\\n之后將其截斷。 所以我使用了這段代碼:

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

由於\\r\\n的計數是硬編碼的,並且也是以一種奇怪的方式計算的(在第一個位置和東西之后使用+1) ,是否有更好的方法可以創建一個函數,即limitContent($content, $lines = 2)並將行數傳遞給$lines參數,默認情況下,它會截斷為兩行?

我目前的代碼是:

/**
 * 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));
}

提前致謝。

您可以使用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;
}

好吧,我誤解了。 這是你想要的嗎?

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

我對Nin的答案中兩個選項之間的性能差異進行了調整,所以我開始快速檢查我手頭的一些數據。 我測試了2個字符串:一個包含許多段落的長字符串和一個包含2個段落的長字符串。

Option 2在第一個字符串上的14 times faster14 times faster ,在第二個字符串上的6% faster6% 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 faster178 times faster ,在第二個字符串上又提高了25 times faster 雖然根據數據和php版本,這些數字可能會對你有很大的改變,但我認為它清楚地表明轉換為數組並返回的速度很慢。 如果表現不是一個問題,我可能仍然會使用Nin的想法,因為它很容易閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM