我使用 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));
}
提前致谢。
答案 0 :(得分: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;
}
答案 1 :(得分: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);
}
答案 2 :(得分:1)
我对Nin's answer中两个选项之间的性能差异进行了调整,因此我开始快速检查一下我手头的一些数据。我测试了2个字符串:一个包含许多段落的长字符串和一个包含2个段落的长字符串。
Option 2
在第一个字符串上变为14 times faster
,在第二个字符串上变为6% faster
。所以这对第一个字符串有很大的优势。
此外,我将Praveen Kumar's最初的想法变成了一个简单的基于循环的版本并对其进行了测试:
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
,在第二个字符串上是另一个25 times faster
。虽然根据数据和php版本,这些数字可能会对你有很大的改变,但我认为它清楚地表明转换为数组并返回的速度很慢。如果表现不是一个问题,我可能仍然会使用Nin的想法,因为它很容易阅读。