PHP代码加亮器,纯JS制作

ice_berg16 2005-06-29 05:58:25
昨天在JS版看到有朋友想用JS实现PHP代码的高亮显示。
PHP已经有二个函数(highlight_string(),highlight_file())实现了这个功能,
自己出于研究心理,用JS实现了这个功能。
目前实现了对关键字,注释和字符串进行了高亮,
在这基础上实现变量,内制函数,常量的显示也是可行的。

演示地址:
http://www.icebergweb.com/code/highlight/
下载地址:
http://www.icebergweb.com/code/highlight/hightlightPHPCode.js


...全文
406 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
ice_berg16 2005-07-01
  • 打赏
  • 举报
回复
已经修正了老大提出的BUG,
to patchclass(黑翼)
修正后:
/*aaaaaaa/*/*/
变为
/*aaaaaaa/*/*/

颜色方面我想最后的"*/" 不应该算注释里的。只能说你的注释写的有问题,
多行注释里不允许嵌套.
xuzuning 2005-07-01
  • 打赏
  • 举报
回复
/*aaaaaaa/*/*/
变为
/*aaaaaaa/*/*
不是bug
这个东西不是语法分析器,你必须给他合法的代码!

<?php
/*aaaaaaa/*/*/
?>
Parse error: syntax error, unexpected '*' in ....
patchclass 2005-07-01
  • 打赏
  • 举报
回复
function JsHighlight(text) {var $delimiter = ",(){}[]-+*%/=\"'~!&|<>?:;.";var $keywords = "abstract|base|bool|boolean|break|byte|case|catch|char|class|const|continue|default|delete|delegate|do|double|else|extends|false|final|finally|float|for|foreach|function|goto|if|implements|import|in|instanceof|int|interface|long|namespace|native|new|null|number|override|package|private|protected|public|readonly|return|seal|short|static|string|super|switch|synchronized|this|throw|throws|transient|true|try|typeof|var|void|while|with";var $specialwords = "Array|Boolean|Date|Error|Function|Math|Number|String|Object|Option|RegExp|prototype|constructor|window|document";var $S = "/*", $E = "*/";var $C = "//";var $Q1 = "\"", $Q2 = "'";var $comment = [];function parse(text) {return _unescape(parseSpecialwords(parseKeywords(parseComment(_escape(text)))));};function parseComment(text) {var i, j, length;i = text.indexOf($Q1);while (i>=0) {j = text.indexOf($Q1,i+1);if (j"+text.substring(i, j+1)+"";text = text.substr(0, Math.max(0,i)) + "@" + length + text.substr(j+1);i = text.indexOf($Q1);}i = text.indexOf($Q2);while (i>=0) {j = text.indexOf($Q2,i+1);if (j"+text.substring(i, j+1)+"";text = text.substr(0, Math.max(0,i)) + "@" + length + text.substr(j+1);i = text.indexOf($Q2);}i = text.indexOf($S);while (i>=0) {j = text.indexOf($E,i+2);if (j > i) {length = $comment.length;$comment[length] = ""+text.substring(i, j+2)+"";text = text.substr(0, Math.max(0,i)) + "@" + length + text.substr(j+2);}i = text.indexOf($S, i+2);}i = text.indexOf($C);while (i>=0) {j = text.indexOf("\n", i+2);if (j < 0) j = text.length-1;if (j > i) {length = $comment.length;$comment[length] = ""+text.substring(i, j-1)+"";text = text.substr(0, Math.max(0,i)) + "@" + length + text.substr(j);};i = text.indexOf($C, i+2);}return text;};function _delimiter() {return "^|$|\\s|\\t|\\" + $delimiter.split("").join("|\\");};function parseKeywords(text) {var regexp = new RegExp("("+_delimiter()+")("+$keywords+")("+_delimiter()+")", "g");return text.replace(regexp, "$1$2$3");};function parseSpecialwords(text) {var regexp = new RegExp("("+_delimiter()+")("+$specialwords+")("+_delimiter()+")", "g");return text.replace(regexp, "$1$2$3");};function _escape(text) {text = text.replace(/@/g, "\\x40");text = text.replace(/ /g, " ");text = text.replace(//g, ">");text = text.replace(/\x5c\x5c/g, "\\");text = text.replace(/\x5c\x22/g, "\"");text = text.replace(/\x5c\x27/g, "\'");return text;};function _unescape(text) {for (var i=$comment.length-1; i>=0; i--)text = text.replace("@"+i, $comment[i]);if(isIE){text = text.replace(/\n/g, "
");};text = text.replace(/\t/g, " ");text = text.replace(/\\x40/g, "@");return text;};return parse(text);}

上面是阿信那个地址解密的代码,用了很多正则的,可以参考下啊
skystar008 2005-07-01
  • 打赏
  • 举报
回复
以前想过用css实现。
patchclass 2005-07-01
  • 打赏
  • 举报
回复
bug报告
/*aaaaaaa/*/*/
变为
/*aaaaaaa/*/*
而且颜色不对

建议还是用我建议的办法,先正则 标记所有的注释
patchclass 2005-07-01
  • 打赏
  • 举报
回复
我觉得效果还是不错的,如果是我也是会采用逐个字符读取的判断的,不知道多次正则的效率如何了
正则的效率并不是非常高的

fason(咖啡人生)的程序不错,怎么不给个打包下载地址啊,还要自己看源代码

判断注释
可以先把 //
和/* */
的注释 用特殊的符号替换标记下
进行着色的时候 对有这些特殊符号的,不着色处理就可以了啊
我个人的思路,不知道大家理解没有
xuzuning 2005-07-01
  • 打赏
  • 举报
回复
还是存在一点问题
输入
<?php
echo "<p> sadadas</p>";
?>
<p> sadadas</p>

显示
<?php
echo "<p> sadadas</p>";
?>
<p> sadadas<p>
wen8u8 2005-07-01
  • 打赏
  • 举报
回复
学学。
xuzuning 2005-07-01
  • 打赏
  • 举报
回复
我是逐个字符读取的,只有遇到字符串或注释时才会查找结束标记,
代码多时速度自然就下降了,
不知道单用正则能否实现。估计困难。

单用正则不能实现,但 正则+排队 可以很好的解决问题。
你可以看一下fason(咖啡人生)的程序,虽然做了扰码处理,但解开还是很容易的
记得前些时候我们和他在javascrip版面讨论过这个事情
jxflll 2005-07-01
  • 打赏
  • 举报
回复
支持!顶!接分!
lzkd 2005-07-01
  • 打赏
  • 举报
回复
ding 一下....接分..呵.
keaizhong 2005-07-01
  • 打赏
  • 举报
回复
回复人: ice_berg16(寻梦的稻草人) ( ) 信誉:125 2005-06-30 18:59:00 得分: 0


你这个肯定不行,关键字也可能存在字符串或注释中,你这样会把所有的关键字都加亮了


确实如此,所以要解决这个问题就可以了,在效率上会比较高一些。

谁正则厉害一点的,可以试试看,我已经想尽了。
或者用另外的折中办法来解决。
象宇 2005-07-01
  • 打赏
  • 举报
回复
敬佩各位高手啊!!!!!
Hellohuan 2005-07-01
  • 打赏
  • 举报
回复
有BUG
输入
<?
$12111

?>


oooo


<?
$12111

?>


oooo

<??>
看看
woolceo 2005-06-30
  • 打赏
  • 举报
回复
接分
xylegend 2005-06-30
  • 打赏
  • 举报
回复
大哥的东西,up
风流才子 2005-06-30
  • 打赏
  • 举报
回复
不错,值得支持一下
ice_berg16 2005-06-30
  • 打赏
  • 举报
回复
大家测试的时候有没有发现BUG??
我暂时还没发现
coolstr 2005-06-30
  • 打赏
  • 举报
回复
很有意思,刚刚下载了。

以后可能会用上。。。。。。
genshing 2005-06-30
  • 打赏
  • 举报
回复
mark~~~
加载更多回复(33)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧