我正在尝试取一个字符串并在某一点切断它(基本上是为了提供所选文本的预览)但内部可能有图像或类似内容(使用BBCode),我想知道是否在PHP中有一种简单的方法可以做到这一点。
示例:
$content = "blah blah blah such and such [img]imagehere[/img] blah blah";
$preview=unknownfunction($content); //cuts off at approx. 40 chars
//do not want this:
$preview="blah blah blah such and such [img]image";//this is bad because half of image is gone
//want this:
$preview="blah blah blah such and such [img]imagehere[/img]"; //this is good because even though it reached 40 chars, it let it finish the image.
有一种简单的方法吗?或者至少,我可以从预览元素中删除所有标签,但我仍然希望这个功能不会切断任何单词。
答案 0 :(得分:1)
检查一下:
$ php -a
php > $maxLen = 5;
php > $x = 'blah blah blah such and such [img]imagehere[/img] blah blah';
php > echo substr(preg_replace("/\[\w+\].*/", "", $x), 0, $maxLen);
blah
答案 1 :(得分:1)
这是一个使用正则表达式的函数
<?php
function neat_trim($str, $n, $delim='') {
$len = strlen($str);
if ($len > $n) {
preg_match('/(.{'.$n.'}.*? )\b/', $str, $matches);
return @rtrim($matches[1]) . $delim;
}else {
return $str;
}
}
$content = "blah blah blah such and such [img]imagehere[/img] blah blah";
echo neat_trim($content, 40);
//blah blah blah such and such [img]imagehere[/img]
?>
答案 2 :(得分:1)
您遇到的一个问题是您需要制定一些规则。如果字符串是
$str = '[img]..[img] some text here... ';
然后你会忽略图像并只提取文本吗?如果是这样,您可能希望使用一些正则表达式从字符串的副本中删除所有BB代码。但是它会在诸如
之类的实例中考虑双方的文本$str = 'txt txt [img]....[/img] txtxtxt ; // will become $copystr = 'txttxt txttxttxt';
您可以使用第一次出现的'[','[img]'或您不希望允许的元素数组的strpos获得'标记'。然后循环通过这些,如果它们小于你想要的'预览'长度,那么使用那个位置++作为你的长度。
<?php
function str_preview($str,$len){
$occ = strpos('[',$str);
$occ = ($occ > 40) ? 40 : $occ;
return substr($str,0,++$occ);
}
?>
如果你想要达到第一个'['那么类似的东西会起作用。如果你想忽略[B](或其他)并允许它们被应用,那么你会想要编写一个允许更复杂的过滤模式。或者 - 如果你想确保它不会在一个单词的中间切断,你必须考虑使用偏移来改变你需要的长度的strpos(''..)。没有一个神奇的1衬里来处理它。
答案 3 :(得分:0)
我找到的一个解决方案是以下
<?php
function getIntro($content)
{
if(strlen($content) > 350)
{
$rough_short_par = substr($content, 0, 350); //chop it off at 350
$last_space_pos = strrpos($rough_short_par, " "); //search from end: http://uk.php.net/manual/en/function.strrpos.php
$clean_short_par = substr($rough_short_par, 0, $last_space_pos);
$clean_sentence = $clean_short_par . "...";
return $clean_sentence;
}
else
{
return $content;
}
}
?>
它可以防止切断单词,但它仍然可以切断标签。我可能会做的是阻止图像在预览文本中发布,并显示我已经存储的预览图像。这样可以防止切断图像。