喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

上一主题 下一主题
 18  1/2  1  2  > 
     
标题: 无聊,发一个高亮php与Html代码的类  
 
litqqs
注册会员
Rank: 2
初级会员


UID 64079
精华 1
积分 154
帖子 116
金钱 144 喜悦币
威望 10
人脉 0
阅读权限 20
注册 2005-5-12
状态 离线
无聊,发一个高亮php与Html代码的类

先给应用示例
例1:

<?php
echo '<style type="text/css">
<!--
.phpcode {
    background: #E8FFE8;
}
code {
    white-space: nowrap;
}
-->
</style>'
;
echo 
highlighter::highlightPhpFile('F:/www/phpMyAdmin/server_binlog.php',0);
?>
例2:

<?php
echo highlighter::highlightHtmlFile('F:/www/kusozone/index.htm',1);
?>
类文件源码

<?php
/*************************************************
* 本单元写于 :
* 作者 : 李腾秋
* E-Mail : litqqs@163.com
* 版权所有 
*************************************************/
/*************************************************
作用: 高亮代码

调用时不必创建highlighter类实例,只需highlighter::funcName()即可
方法原型列表:
string highlighter::highlightHtmlFile(string $file, bool $line_number=false)
string highlighter::highlightHtml(string $code, bool $line_number=false)
string highlighter::highlightPhpFile(string $file, bool $and_html=true)
string highlighter::highlightPhp(string $code, bool $and_html=true)

*************************************************/
if(! defined(__FILE__))
{
    
define(__FILE__,1);
    class 
highlighter 
    
{
        function 
highlighter()
        {
        }

        
//高亮htm文件
        
function highlightHtmlFile($file$line_number=false)
        {
            
$code file_get_contents($file);
            return 
highlighter::highlightHtml($code$line_number);
        }
        
//方法 __pv($m) 仅供 方法 highlightHtml 内调用
        
function __pv($m)
        {
            
$reg='/=s*"([^"]*?)"/i';
            
$str preg_replace($reg'<font color="#3300FF">=</font><font color="#FF33CC">"${1}"</font>'$m[2]);
            return 
'&lt;'.$m[1].'<font color="#FF6600">' $str '</font><font color="#0000FF">'.$m[3].'</font>';
        }
        
//方法 __htmlspace($m) 仅供 方法 highlightHtml 内调用
        
function __htmlspace($m)
        {
            
$result str_replace("t"'&nbsp;&nbsp;&nbsp;&nbsp;'$m[0]);
            
$result str_replace(' ''&nbsp;'$result);
            return 
$result;

        }
        
//高亮html代码
        
function highlightHtml($code$line_number=false)
        {
            
$code htmlspecialchars($code);
            
//$code = str_replace(" ","&nbsp;",$code); //替换空格替换为&nbsp;
            //$code = nl2br($code); //将回车替换为<br>
            //htm标签
            
$code  =  preg_replace_callback('/&lt;([a-zA-Z0-9]+)(.*?)(/?&gt;)/',array('highlighter','__pv'), $code);

            
$code  =  preg_replace('/(&lt;[a-zA-Z0-9]+)/',  '<font color="#0000FF">$1</font>',  $code);
            
$code  =  preg_replace('/(&lt;/[a-zA-Z0-9]+&gt;)/',  '<font color="#0000FF">$1</font>',  $code);
            
$code  =  preg_replace('/(/&gt;)/',  '<font color="#0000FF">${1}</font>',  $code);
            
//$code = preg_replace('/(&lt;/?[a-zA-Z]+&nbsp;.*?&gt;)/','<font color="#0000FF">${1}</font>', $code);
            
            
$code preg_replace('/&lt;!DOCTYPEs+.+?&gt;/','<font color="#3300FF">${0}</font>',$code);
            
//注释
            
$code  =  str_replace('&lt;!--',  '<font color="#666666"><em>&lt;!--',  $code);
            
$code  =  str_replace('--&gt;',  '--&gt;</em></font>',  $code);
            
            
//--------------以下是专为visualTpl模板文件而定制的高亮代码--------
            //block : begin|end
            
$code  =  preg_replace('/(&lt;!--s*)(begin|end)(s+)([a-z_x7f-xfe]+)/i','${1}<font size="" color="#0000FF"><b>${2}</b></font>${3}<b><font color="#FF0000">${4}</font></b>',  $code);
            
$code  =  preg_replace('/($[a-z0-9_]+)s*=s*(per|on)(([0-9]+),('.*?'),('.*?'))/i','<font color="#009900"><b>${1}</b></font>=<font color="#0000FF">${2}</font>(${3},<font color="#FF9999">${4}</font>,<font color="#FF9999">${5}</font>)',  $code);
            
//vip    : vip|endvip
            
$code  =  preg_replace('/<font color="#666666"><em>&lt;!--s*vip/i',  '<span style="display:block;border:1px dashed #696969;padding 3px" >${0}',  $code);
            
$code  =  preg_replace('/&lt;!--s*endvips*--&gt;</em></font>/i',  '${0}</span>',  $code);
            
//ssi   : #include
            
$code  =  preg_replace('/&lt;!--s*#includes+file.+?--&gt;/i','<span style="background-color:#FFFF66; font-weight:bold; font-style:normal;padding:3px">${0}</span>',$code);
            
//无格式变量 
            
$code preg_replace('/({$[a-zA-Z0-9_x7f-xfe]+})/','<font style="background-color:#D7FED1;padding:1px" color="#009900">${1}</font>'$code);
            
//格式变量
            
$code preg_replace('/({$[a-zA-Z0-9_x7f-xfe]+;)([a-zA-Z]+)='([^']+?)'}/','<font style="background-color:#D7FED1;padding:1px" color="#009900">${1}<font color="#CC0000">${2}</font>=<font color="#FF33CC">'${3}'</font>}</font>', $code);
            //--------------定制代码结束--------------

            $code  =  preg_replace_callback('
/>[^<]+?</',array('highlighter','__htmlspace'), $code);
            //$code = nl2br($code);
            if(! $line_number){
                return '
<PRE>'.$code.'</PRE>';
            }else{
                $code = '
<pre><ol><li>' . str_replace("n",'</li><li>',$code) . '</li></ol></pre>'; 
                return $code;
            }
        }
        //高亮php代码,支持php与HTMl混合,同时高亮html
        function highlightPhpFile($file,$and_html=true)
        {
            $code = file_get_contents($file);
            return highlighter::highlightPhp($code, $and_html);
        }
        //高亮php代码,支持php与HTMl混合,同时高亮html
        function highlightPhp($code,$and_html=true)
        {
            $code_array = highlighter::divPhpHtml($code);
            $count = count($code_array);
            $result='';
            if($and_html){
                $phpcode=array();
                for($i=0;$i<$count;$i++){
                    if('
php'==$code_array[$i][0]){                               
                        $phpcode['
__inner___php___code_'.$i.'_'] ='<span class="phpcode">'. highlight_string($code_array[$i][1],true).'</span>';
                        $result .= '
__inner___php___code_'.$i.'_';
                    }else{
                        $result .= $code_array[$i][1];
                    }
                }
                $result = highlighter::highlightHtml($result,false);
                //重组php与htm代码
                $result = str_replace(array_keys($phpcode), $phpcode, $result);
            }else{
                for($i=0;$i<$count;$i++){
                    $hc='';
                    if('
php'==$code_array[$i][0]){                               
                        $hc ='
<span class="phpcode">'. highlight_string($code_array[$i][1],true).'</span>';
                    }else{
                        $hc =htmlspecialchars($code_array[$i][1],true);
                        $hc =str_replace(' ', '
&nbsp;', $hc);
                        $hc =str_replace("t", '
&nbsp;&nbsp;&nbsp;&nbsp;', $hc);
                        $hc =nl2br($hc);
                    }
                    $result .= $hc;
                }
            }
            $result = str_replace('
<code>','',$result);
            $result = str_replace('
</code>','',$result);
            return '
<code>'. $result.'</code>';
        }
        //将php与HTMl混合的代码分开,返回数组
        function divPhpHtml($code)
        {
            $result=array();
            $pos=1;
            $pre=0;
            $in_php_code=false;
            $len = strlen($code);
            //只有一个或两个字符的的时候
            if($pos >= $len-1) {
                $result[]= $code;
                return     $result;
            }
            while($pos < $len)
            {    
                $symbol = $code[$pos];
                $pre_symbol = $code[$pos-1];
                $pos++;
                if("n"==$symbol || "r" == $symbol) continue;
                if(!$in_php_code && '
?'==$symbol && '<'==$code[$pos-2]){
                    $in_php_code=true;
                    //保存前一段代码
                    if($pos-2 > $pre){
                        $html_code =  trim(substr($code, $pre, $pos-2 - $pre));
                        $result[]= array('
htm',$html_code);
                        $pre = $pos-2;
                    }
                    continue;
                }
                //双引号字符串
                if('"'==$symbol && $in_php_code){
                    $in_dqm_string=true;
                    while($in_dqm_string && $pos < $len){
                        if('"' != $code[$pos]){
                            $pos++;
                            continue;
                        }
                        $in_dqm_string=false;
                        if('' == $code[$pos -1]){
                            $escape_num=1;
                            while('' == $code[$pos - $escape_num]) $escape_num++; 
                            $in_dqm_string = 0 == ($escape_num % 2);
                        }
                        $pos++;
                    }
                    continue;
                }
                //单引号字符串
                if('''
==$symbol && $in_php_code){
                    
$in_sqm_string=true;
                    while(
$in_sqm_string && $pos $len){
                        if(
''' != $code[$pos]){
                            $pos++;
                            continue;
                        }
                        $in_sqm_string=false;
                        if('' == $code[$pos -1]){
                            $escape_num=1;
                            while('' == $code[$pos - $escape_num]) $escape_num++; 
                            $in_sqm_string = 0 == ($escape_num % 2);
                        }
                        $pos++;
                    }
                    continue;
                }
                //行注释
                if(('
/'==$symbol && '/'==$pre_symbol || '#'== $symbol) && $in_php_code){
                    
while("n" != $code[$pos] && "r"!=$code[$pos] && $pos $len$pos++;
                    continue;
                }
                
//块注释
                
if('*'==$symbol && '/'==$pre_symbol && $in_php_code){
                    
$in_block_comment=true;
                    while(
$in_block_comment && $pos $len){
                        
$in_block_comment = !('/' == $code[$pos] && '*'==$code[$pos-1]);
                        
$pos++;
                    } 
                    continue;
                }
                
//HereDoc代码块
                
if('<'==$symbol && '<'==$pre_symbol && '<'==$code[$pos-3] && $in_php_code){
                    
$in_here_doc=true;
                    while(
' '==$code[$pos] || "t"==$code[$pos]) $pos++;
                    
$here_doc_syntax='';
                    
//取here_doc的标识字串
                    
while("n"!=$code[$pos] && "r"!=$code[$pos] && $pos<$len){
                        
$here_doc_syntax .= $code[$pos];
                        
$pos++;
                    }
                    
$here_doc_syntax .= ';';
                    while(
$in_here_doc && $pos<$len){
                        
$pos++;
                        
$line_string='';
                        while(
"n"!=$code[$pos] && "r"!=$code[$pos] && $pos<$len){
                            
$line_string .= $code[$pos];
                            
$pos++;
                        }
                        
$in_here_doc $line_string != $here_doc_syntax;
                    }
                    continue;
                }
                
//php代码块结束
                
if('>'==$symbol && '?'==$pre_symbol && $in_php_code){
                    
$in_php_code=false;
                    
$php_code =  trim(substr($code$pre$pos $pre));
                    
$result[]= array('php',$php_code);
                    
$pre $pos;
                    
$pos++;
                }
             
            }
            if(
$pre != $pos){
                
$type = ($in_php_code)?'php':'htm';
                
$result[] = array($typetrim(substr($code$pre$pos $pre)));
            }
            return 
$result;
        }

    }
//end class
}//end if
?>
[ 本帖最后由 litqqs 于 2006-7-26 05:35 PM 编辑 ]




心动就要行动.
秋士出品,必是精品.
2006-7-26 05:33 PM#1
查看资料  访问主页  发短消息  QQ  顶部
 
litqqs
注册会员
Rank: 2
初级会员


UID 64079
精华 1
积分 154
帖子 116
金钱 144 喜悦币
威望 10
人脉 0
阅读权限 20
注册 2005-5-12
状态 离线
[推荐阅读] www.265.com都用了那些技术?
顺求栽种杜鹃的方法.
俺的杜鹃花就快没救了.




心动就要行动.
秋士出品,必是精品.
2006-7-26 05:42 PM#2
查看资料  访问主页  发短消息  QQ  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 贡献PHP获取网卡的MAC地址
在例子中试下echo highlighter::highlightHtmlFile(__FILE__,1);
我不种花




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-7-26 07:41 PM#3
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
litqqs
注册会员
Rank: 2
初级会员


UID 64079
精华 1
积分 154
帖子 116
金钱 144 喜悦币
威望 10
人脉 0
阅读权限 20
注册 2005-5-12
状态 离线
[推荐阅读] 从MYSQL取得的数据怎样排序?
highlighter::highlightHtmlFile是高亮htm文件的,不是是高亮php文件

代码在这里显示的时候少了些反斜线了.传压缩文件吧.


 附件: 您所在的用户组无法下载或查看附件



心动就要行动.
秋士出品,必是精品.
2006-7-26 08:03 PM#4
查看资料  访问主页  发短消息  QQ  顶部
 
cleverbug
乞丐




UID 80677
精华 0
积分 -1
帖子 1
金钱 -1 喜悦币
威望 0
人脉 0
阅读权限 1
注册 2006-9-28
状态 离线
[推荐阅读] SQLyog Enterprise V5.02 汉化版
不错,支持
2006-9-28 10:18 AM#5
查看资料  发短消息  顶部
 
jhg (jhg)
乞丐

初级会员



UID 62881
精华 0
积分 -1
帖子 7
金钱 -1 喜悦币
威望 0
人脉 0
阅读权限 1
注册 2005-1-2
状态 离线
[推荐阅读] 中国传播网 服务器租/托管特价优惠
不错,下来看看
2006-9-30 12:54 PM#6
查看资料  发短消息  顶部
 
zerofirecn (zerofirecn)
新手上路
Rank: 1
初级会员



UID 24616
精华 0
积分 15
帖子 58
金钱 15 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-11-14
状态 离线
[推荐阅读] rico类库问题求解!
谢谢 尝试中
2006-10-7 02:09 PM#7
查看资料  发短消息  顶部
 
bg6aer (bg6aer)
注册会员
Rank: 2
初级会员



UID 19816
精华 0
积分 51
帖子 59
金钱 51 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2003-4-23
状态 离线
[推荐阅读] WAP
dsfas das d
2007-6-9 11:42 PM#8
查看资料  访问主页  发短消息  顶部
 
rjp_ww
注册会员
Rank: 2
初级会员


UID 67694
精华 0
积分 163
帖子 421
金钱 163 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-1-2
状态 离线
[推荐阅读] PHP源码
很好,支持LZ。
2007-6-12 08:21 AM#9
查看资料  发短消息  顶部
 
MyNetInfo
高级会员
Rank: 4


UID 93234
精华 0
积分 943
帖子 491
金钱 0 喜悦币
威望 0
人脉 943
阅读权限 50
注册 2007-5-18
状态 离线
[推荐阅读] 逐行(没有固定次序)写MySQL数据库,帮我提升一下效率!
不是一般的支持你,我正需要呢,看来又不用写了。同时BS一下楼主,是你让我没机会学东西的,以后有事就找你。



 
打过针,吃过药,女浴室里拍过照! 打过狼,杀过虎,俺跟村姑跳过舞! 爬过山,涉过水,我跟村姑有一腿!
 
2007-6-13 08:54 AM#10
查看资料  访问主页  Blog  发短消息  顶部
 18  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.054440 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP