2012-12-18 21 views
0

目前,我通过文字这一功能,以缩短下来的标语,其中有255个字符的限制:如何在切割字符串时切断bbcode?

function myTruncate($string, $limit, $break=".", $pad="...") 
{ 
    // return with no change if string is shorter than $limit 
    if(strlen($string) <= $limit) 
    { 
     return $string; 
    } 

    // is $break present between $limit and the end of the string? 
    if(false !== ($breakpoint = strpos($string, $break, $limit))) 
    { 
     if($breakpoint < strlen($string) - 1) 
     { 
      $string = substr($string, 0, $breakpoint) . $pad; 
     } 
    } 
    return $string; 
} 

问题是,它不断地切断bbcodes,有没有办法把它完成一切它是否被切断,如果它的内部任何bbcode标签?

+1

你是如何渲染缩短的价值?如果你正在渲染它(没有BBcode),考虑从结果中省略BBcode。 – Matthew

+0

虽然我确实想要一些bbcode。 – NaughtySquid

回答

0

有可能不容易解决了这一点。您需要检查整个输入字符串字符以记住内存堆栈(也称为Lexer)中的每个打开的bbcode标记。然后,如果您的字符限制已经达到,您需要附加您存储在堆栈中的所有关闭bbcode标签。

此外,您的截断函数有一个很大的缺点,即它将bbcode标记为文本长度的一部分。试想一个用户通过[url = http://非常长的链接]图片[/ url]发布250个字符长的链接。 Google图片例如创建了这样长的链接。

最好的办法就是彻底去掉这些情况下的bbcode,除非这些特性能证明解决方案的编程时间为5-20小时。