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

RSS 订阅当前论坛  

喜悦证交所已经关闭

上一主题 下一主题
     
标题: 以php分界符正确的分解成数组,php代码智能自动匹配?至今没人实现  
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
以php分界符正确的分解成数组,php代码智能自动匹配?至今没人实现

我们都知道,如果一篇php教程,里面有文字或php代码都很正常。但是,文字终归是文字,要格式化一篇教程内容不能以一个highlight_string了事。只把php代码部份highlight_string,文字还是保留其原有的结构。这就需要将php代码从教程文章中分解出来。分解成数组就好不过了。
以下代码在Dreamweaver下高亮颜色显示正确,在EditPlus下高亮颜色代码出错。在用php脚本的highlight_string代码居然也不正确!!!!

以下代码下载:http://qh8.net/test/highlight_code.rar
代码分解的数组效果如: http://qh8.net/test/code.php

<?php
$a=array(
"这是第1个: \n<a href=\"",
"<?php echo \"这是第2个<br />\";?>",
"\">这是第3个</a>\n\n",
"<?php echo \"这是第4个\";?>",
"\n<?php \necho '?>这是第5个<?php echo 3; ?>'; \necho '****<br />'; \n/* \n<?php \n\n    echo '星号区域';// \n?> \n*/ \n?>",
"\n这是第6个:",
"<?= '<?这是第7个'; ?>",
" \n",
"<?php \necho '<?这是第8个'; \n?>",
" \n");

echo '<pre>';
echo "将这段话以php分界符正确的分解成数组<hr>";
//(&lt;?php ?&gt;)
highlight_string(unhtmlentities(implode('', $a)));
echo "<hr>";
foreach ($a as $key=>$value){
        $b[$key] = htmlspecialchars($value);
}
echo "结构数组<hr>";
print_r( $b );

function unhtmlentities ($string) {
   $trans_tbl =get_html_translation_table (HTML_ENTITIES );
   $trans_tbl =array_flip ($trans_tbl );
   return strtr ($string ,$trans_tbl );
}
?>

至今没有人使用这样成功的分解方案。怎么样,挑战一下自已,也为广大phper做一份努力?!!

[ 本帖最后由 qh663 于 2006-6-17 04:14 PM 编辑 ]


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



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-6-17 04:08 PM#1
查看资料  访问主页  Blog  发短消息  QQ . .   顶部
 
moocky (木目子)
高级会员
Rank: 4
风铃浅唱文学原创



UID 17594
精华 0
积分 859
帖子 853
金钱 859 喜悦币
威望 0
人脉 0
阅读权限 50
注册 2002-11-8
状态 离线
[推荐阅读] 在网上看到一个PHP程序员的帖子 转贴
既然你都说至今没人分解成功过,那你还是保留吧!
2006-6-20 09:16 AM#2
查看资料  访问主页  发短消息  QQ . .   顶部
 
litqqs
注册会员
Rank: 2
初级会员


UID 64079
精华 1
积分 154
帖子 116
金钱 144 喜悦币
威望 10
人脉 0
阅读权限 20
注册 2005-5-12
状态 离线
[推荐阅读] 面向对象和基于对象到底是什么概念?
如你所愿,欢迎测试.

就花几个钟,为大众贡献一点代码.如有出错的地方,还请大家提出来,以便修正.
测试的次数不是太多.难免会有出错的地方.请大家海涵
测试环境:
php4/php5
windowXP

本人是以命令行方式执行.


<?php
$html_php_code 
file_get_contents('e:\ttt.php');
print_r(divPhpHtml($html_php_code));

//功能函数
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-$pre){
                
$html_code =  substr($code$pre$pos-$pre);
                
$result[]= $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 = 1 == ($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_dqm_string = 1 == ($escape_num % 2);
                }
            }
            $pos++;
            continue;
        }
        //行注释
        if('
/'==$symbol && '/'==$pre_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 .= '
;';
            echo $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 =  substr($code, $pre, $pos - $pre);
            $result[]= $php_code ;
            $pre = $pos;
            $pos++;
        }
     
    }
    if($pre != $pos){
        $result[] = substr($code, $pre, $pos - $pre);
    }
    return $result;
}
?>
[ 本帖最后由 litqqs 于 2006-6-20 05:48 PM 编辑 ]
2006-6-20 05:45 PM#3
查看资料  访问主页  发短消息  QQ . .   顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 免费PHP 空间
村里的高亮代码一直都掉字符,还是传文件上来吧。



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-6-21 08:58 PM#4
查看资料  访问主页  Blog  发短消息  QQ . .   顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 系统严重安全警告
很不错!!!发现个小问题,请试下面的代码,在第二行加了一个 \' 字符,高亮失败。代码贴上来显示有错,以附件传上来。包括高亮测试代码。

--------------------------------------------------------------------------------------
这是第1个:
<a href="<? echo '\'这是第2个<br />';?>">这是第3个</a>   <==更改了这一句

<?php echo '这是第4个';?>

<?php
echo '?>这是第5个<?php echo 3; ?>';
echo '****<br />';
/*
<?php
        echo '星号区域';//
?>
*/
?>

这是第6个:<?= '<?这是第7个'; ?>
<?
echo '<?这是第8个';
?>
--------------------------------------------------------------------------------------

[ 本帖最后由 qh663 于 2006-6-22 12:03 PM 编辑 ]


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



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-6-22 11:56 AM#5
查看资料  访问主页  Blog  发短消息  QQ . .   顶部
 
litqqs
注册会员
Rank: 2
初级会员


UID 64079
精华 1
积分 154
帖子 116
金钱 144 喜悦币
威望 10
人脉 0
阅读权限 20
注册 2005-5-12
状态 离线
[推荐阅读] 最高级别警告——微软刚刚发布最严重级别安全公告
你所提到的问题已修正.

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



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


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] php_imagemagick能在win 下安装吗?
厉害 !! 谢谢你为大家做的一切 !
验收完毕。代码颜色与Dreamweaver8显示的是一样了!




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


UID 64079
精华 1
积分 154
帖子 116
金钱 144 喜悦币
威望 10
人脉 0
阅读权限 20
注册 2005-5-12
状态 离线
[推荐阅读] 请教pear包的核心文件是哪几个.




心动就要行动.
秋士出品,必是精品.
2006-6-22 05:34 PM#8
查看资料  访问主页  发短消息  QQ . .   顶部
 
waterhk (waterhk)
乞丐

初级会员



UID 51024
精华 0
积分 -1
帖子 12
金钱 -1 喜悦币
威望 0
人脉 0
阅读权限 1
注册 2004-11-18
状态 离线
[推荐阅读] 为啥一开IE,CPU的占用率就达100%
ぃ岿狥﹁..や
2006-6-23 02:04 AM#9
查看资料  发短消息  顶部
     


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


 




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

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