此方法是一字一字往下抓ansi颜色码转换,有点土法炼钢。当前和大部分telnet软件
比较不同是他们换行就有自动作退出码,而我这个并没有作。
echo
;
echo ansi_2_html(fread(fopen(1.txt,r),filesize(1.txt)));
echo ;
## ansi 转换成 html
function ansi_2_html($string){
$ansi_light=array(0=>000000,1=>#ff0000,2=>#00cc00,3=>#ffff00,4=>#3366ff,5=>#cc33cc,6=>#66ffff,7=>#ffffff);
$ansi_dark =array(0=>000000,1=>#840000,2=>#008200,3=>#ad4100,4=>#000084,5=>#840084,6=>#00b6b5,7=>#c6c7c6);
## 颜色样本同cnews
$flag_have_ansi= 0;
$dl = 0;
$flag_hava_bg = 0;
$string=str_replace(chr(27).'[m',chr(27).'[0m',$string);
for($i=0;$istrlen($string);$i++):
if($string[$i]==chr(27)):
$laststring=substr($string,$i,strlen($string)-$i);
if(ereg(chr(27).\[([0-8;]{0,}[^m])m,$laststring)):
$ansicode=substr($laststring,2,strpos($laststring,'m')-2);
$i=$i+strpos($laststring,'m');
$rendition=split(;,$ansicode);
if(is_array($rendition)) sort($rendition);
for($j=0;$jcount($rendition)-1;$j++):
$rendition[$j]=(int)$rendition[$j];
if($rendition[$j]=='1') $dl=1;
if($rendition[$j]=='0') $dl=0;
$ansi=($dl=='0') ? $ansi_dark : $ansi_light;
if($rendition[$j]10):
if($rendition[$j]==0) :
$style=background-color:#000000;text-decoration:none;;
$tempbg=;
endif;
if($rendition[$j]==1)
$style=color:#ffffff;;
if($rendition[$j]==4)
$style=$style.text-decoration:underline;;
# 5 blink on
# 7 reverse video on
# 8 nondisplayed (invisible) 缺 不知道如何实作显示,但大部分后三者用不到
endif;
if($rendition[$j]>=30&&$rendition[$j]37):
$style=$style.color:.$ansi[$rendition[$j]%10].;;
$style=$style.$tempbg;
endif;
if($rendition[$j]>=40):
$flag_hava_bg = 1;
$style=$style.background-color:.$ansi_dark[$rendition[$j]%10].;;
$tempbg=background-color:.$ansi_dark[$rendition[$j]%10].;;
endif;
endfor;
if($flag_have_ansi==1):
$font=;
elseif($flag_have_ansi==0):
$flag_hava_bg = 0;
$tempbg =;
$font=;
endif;
$flag_have_ansi=1;
$myansi.=$font;
endif;
else:
$myansi.=$string[$i];
endif;
endfor;
return .$myansi;
}
下图为telnet软件浏览
下图为浏览器浏览
