我意识到以前在这个论坛上也有人问过这个问题,但建议的解决方案对我来说并不可靠。
到目前为止,我已经为此工作了一周或更长时间,昨天我一直熬夜到凌晨 3 点,但我离题了,让我谈谈手头的问题:
对于那些不知道的人,mirc 使用 ascii 控制代码来控制字符颜色、下划线、粗细和斜体。颜色的ASCII码是3,粗体2,下划线1F,斜体1D,反向(黑底白字),16。
作为该数据将要输入的形式的示例,我们有(在正则表达式中,因为这些字符不会打印):
\x034this text is red\x033this text is green\x03 \x02bold text\x02
\x034,3this text is red with a green background\x03
等等。
以下是我尝试修改以供自己使用的两个函数,但返回的结果不可靠。在我进入该代码之前,具体来说“不可靠”,有时代码会解析,有时文本中仍然会留下控制代码,我不知道为什么。反正;
function mirc2html($x) {
$c = array("FFF","000","00007F","009000","FF0000","7F0000","9F009F","FF7F00","FFFF00","00F800","00908F","00FFFF","0000FF","FF00FF","7F7F7F","CFD0CF");
$x = preg_replace("/\x02(.*?)((?=\x02)\x02|$)/", "<b>$1</b>", $x);
$x = preg_replace("/\x1F(.*?)((?=\x1F)\x1F|$)/", "<u>$1</u>", $x);
$x = preg_replace("/\x1D(.*?)((?=\x1D)\x1D|$)/", "<i>$1</i>", $x);
$x = preg_replace("/\x03(\d\d?),(\d\d?)(.*?)(?(?=\x03)|$)/e", "'</span><span style=\"color: #'.\$c[$1].'; background-color: #'.\$c[$2].';\">$3</span>'", $x);
$x = preg_replace("/\x03(\d\d?)(.*?)(?(?=\x03)|$)/e", "'</span><span style=\"color: #'.\$c[$1].';\">$2</span>'", $x);
//$x = preg_replace("/(\x0F|\x03)(.*?)/", "<span style=\"color: #000; background-color: #FFF;\">$2</span>", $x);
//$x = preg_replace("/\x16(.*?)/", "<span style=\"color: #FFF; background-color: #000;\">$1</span>", $x);
//$x = preg_replace("/\<\/span\>/","",$x,1);
//$x = preg_replace("/(\<\/span\>){2}/","</span>",$x);
return $x;
}
function color_rep($matches) {
$matches[2] = ltrim($matches[2], "0");
$bindings = array(0=>'white',1=>'black',2=>'blue',3=>'green',4=>'red',5=>'brown',6=>'purple',7=>'orange',8=>'yellow',9=>'lightgreen',10=>'#00908F',
11=>'lightblue',12=>'blue',13=>'pink',14=>'grey',15=>'lightgrey');
$preg = preg_match_all('/(\d\d?),(\d\d?)/',$matches[2], $col_arr);
//print_r($col_arr);
$fg = isset($bindings[$matches[2]]) ? $bindings[$matches[2]] : 'transparent';
if ($preg == 1) {
$fg = $bindings[$col_arr[1][0]];
$bg = $bindings[$col_arr[2][0]];
}
else {
$bg = 'transparent';
}
return '<span style="color: '.$fg.'; background: '.$bg.';">'.$matches[3].'</span>';
}
并且,如果它是相关的,在哪里调用代码:
$logln = preg_replace_callback("/(\x03)(\d\d?,\d\d?|\d\d?)(\s?.*?)(?(?=\x03)|$)/","color_rep",$logln);
我当然也尝试过查看各种基于 php/ajax 的 irc 客户端完成的方法,但那里没有任何成功。至于做这个 mirc 方面,我也看过那里,虽然结果比 php 更可靠,但发送到服务器的数据呈指数增长,以至于套接字在上传时超时,所以它不是一个可行的选择。
与往常一样,我们将不胜感激在此问题上的任何帮助。