如题,想到一种方法,使用堆栈。
每遇到一个html标签,就压栈,当遇到它的关闭标签时,就出栈(当然,直到找到对应的关闭标签)。
不过,这就存在一个问题,如果是代码规范是html4而不是xhtml,则会遇到<br>
、<img>这类没有关闭标签的标签。早知道这样,当时博客代码就应该用xhtml来写。不过要改的话,很多文章都需要转换,还是算了。所以打消使用这种方法的念头。因为html天生具有较强的容错性,少了关闭标签,解释器自动会帮你补全,所以不用担心这个问题。
目前,我还是使用之前的方法,只需要保证不会把一个标签阶段就行了。
我定义两个计算变量,一个open,一个closed,分别用来记录<和>的数目。如果open==closed,则可以安全截断。另外还要考虑中文编码的问题。不能把一个utf8字给截断了,就出现乱码了。
我现在把之前的C代码直接改写为php代码如下:
/* 截取文章前部分 2009-9-24 17:19:03 */
function make_preview( $str, $id ){
$open=0;
$closed=0;
$s = $str;
if( strlen($s)<=128 )
return $s;
$len = strlen($s);
for( $i=0, $j=0; $i<$len; $i++, $j++ ){
//utf8
if( $str[$i] == '<' ){
$open ++;
}else if( $s[$i]=='>'){
$closed ++;
}else if( ord($s[$i])>=0xF0 ){
$i+=3;
$j+=2;
}else if( ord($s[$i])>=224 ){
$i+=2;
$j+=1;
}else if( ord($s[$i])>=0xC0 ){
$i+=1;
}
if ( $open==$closed && $j > 128 ){
$s = substr( $s, 0, $i+1 );
$s .= "";
return $s;
}
}
return $s;
}
抱歉我的 blog 使用了大量的
*br*>
* 号自行去掉
悲剧 – –
我以为xiaoxia的blog很受欢迎,一下子就三个回复,原来都是FB童鞋的贡献啊。。。
To ForeverBell, * what’s up?
to Xiaoxia, 难道是我出现幻觉了,HD的表弟(219.234.81.×) 和 Xiaoxia(219.234.81.×)竟然在同个ip段。。。 还有Xiaoxia你的控制台怎么没密码?可以进去随便逛逛?
to kdm, 那不是搜狗浏览器的代理服务器IP么? 教育网用搜狗访问外部网络都是这个IP段吧。
为什么不借助正则表达式?
很少用正则,不熟练呢。也不清楚正则对中文的处理如何。
预览的时候标签由程序加上,那就规范了
自己只要写文本就行了
要是插入图片呢?
[img]图片地址[/img]
貌似也挺麻烦的。