繁体   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