七月
30

让你的评论框自由粘贴代码

前两天我写过一篇《为评论框添加文字格式化编辑器 》,其中zwwoOoOo在留言中说希望有一种可以转换“<”为html实体符号的方法,所以我给了他一段可以将选中的文字中的“<”转换为“&lt;”的js代码。

后来我仔细想了一下,觉得这个功能很有必要,因为经常有人会询问一些问题,而向他们解释时,评论框中贴进去的代码都会被wordpress给屏蔽掉。我写的那段转换符号代码虽然可以正确转换选中的代码,但是由于需要手动选择黏贴的代码,并点击转换按钮才行。而一旦忘记转换,则就杯具了。

所以,我想要一种可以自动转换的方法,并尽量完美的方法。

先解释两个名词:

嵌套的标签

即code标签内还嵌了一层或多层code标签,这种情况发生在<code>标签就是你贴入的代码一部分。

<code>
//这里是一层代码
    <code>
//    这里是二层代码
    </code>
//这里是一层代码
</code>

并行的标签

即有若干对code标签同时处于同一层

<code>
//这里是代码
</code>
//其他内容或空行
<code>
//这里是代码
</code>

对这两种不同情况应该怎么处理呢?

我是觉得应该这样,嵌套的标签则只有最外层标签有效,中间的都需要转换。平行的标签则分别处理,当成不同的代码块。

我前后试用了三种方法。

第一,我想写一个超级正则表达式,来直接将评论框中<code></code>包围的字符串中的“<”转换为“&lt;”。对于只有一对<code></code>标签的内容可以正确转换,但是对于嵌套的<code>标签、并行的<code>标签就会出现问题了,最后考虑了两个两个小时也没想出解决办法,只好放弃正则方法。或许正则可行,有高手欢迎指点。

第二种方法是将评论框中内容以<code>分割,然后分别处理,但是这种方法对于嵌套的就会出错,因为连续两个以上的<code>标签,在分割时中间的部分会被分割成无标志点(</code>)的片段,所以也无法处理。

第三种,也就是我现在试验成功的方法,是使用基于队列的搜索算法。这也是今天一天的成果吧,一整天都在想这个了。最后精简精简,再精简,代码只有20行了。

使用方法是,将下面的代码直接加入到页面里,比如加到你现在的js文件后面,或者都通<script>标签加到页面中即可。

(function(){
 
    if(document.getElementById('commentform')||0)
 
        document.getElementById('commentform').onsubmit=function(){
 
            var myField=document.getElementById('comment')
 
            var str=myField.value;
 
            var start=str.indexOf('<code>');
 
            var end=str.indexOf('</code>');
 
            if(start>-1&&end>-1&&start<end){
 
                myField.value='';
 
            }else return;
 
            while(end!=-1){
 
                myField.value+=str.substring(0,start+6)+str.substring(start+6,end).replace(/<(?=[^>]*?>)/gi,'&lt;').replace(/>/gi,'&gt;');
 
                str=str.substring(end+7,str.length);
 
                start=str.indexOf('<code>')==-1?-6:str.indexOf('<code>');
 
                end=str.indexOf('</code>');
 
                if(end==-1){
 
                    myField.value+='</code>'+str;
 
                }else if(start==-6){
 
                    myField.value+='&lt;/code&gt;';
 
                }else{
 
                    myField.value+='</code>';
 
                }
 
            }
 
        }
 
})();
 

需要注意的是,你的评论表单的id需是commentform,评论框的id需是comment,如果不是则需要做相应修改。

添加好以后,则在需要显示代码时,将代码包围在<code>标签中即可。比如,你要在评论里显示

<?php echo $title; ?>

,则只需要输入

<code><?php echo $title; ?></code>

即可。

至于加上<code>标签,你可以手动输入,也可以参考我的文章《为评论框添加文字格式化编辑器 》,给评论框 加上可以添加<code>标签的的按钮。

测试的话可在我这里测试,你可以选择你的代码后点击评论框工具栏上的add code按钮,即可自动将代码包含在<code>标签中。也可以手动输入<code>标签

也许还有bug,欢迎测试报告。

捕获

是的,你只需将上面的那段js代码在页面里引入即可生效。

也许有人已经发现了,事件处理是表单的submit事件,一开始我是选择提交按钮的onclick事件,后来又改成了现在这个。有兴趣的同学可以了解一下这两个事件的区别。我就不多说了。

本文标签: , , , ,

分享

本文短网址: http://qiqi.boy.im/5t

这篇文章已经有 66 条评论

Comments (64) Trackbacks (2)
You can leave a response or Trackback this entry .
  1. QiQiBoY -#1

    <blockquote cite="#commentbody-3384"><br>
    <strong><a href="#comment-3384">TEST</a> :</strong><p>有一个code标签,包含在这里面就不会自动转换了..如:<br><br>
    <code>'""!@#$%^&*()

  2. QiQiBoY -#2

    将上条评论的html代码全部显示出来:
    <blockquote cite="#commentbody-3518">
    <strong><a href="#comment-3518">QiQiBoY</a> :</strong><p><code><blockquote cite="#commentbody-3384"><br><br>
    <strong><a href="#comment-3384">TEST</a> :</strong><p>有一个code标签,包含在这里面就不会自动转换了..如:<br><br><br>
    <code>'""!@#$%^&*()</code></p>
    </blockquote>

  3. liuqiqi -#3

    也可以插入音乐了,限mp3格式。。

  4. 超人 -#4

    再来看看你的能不能发图片了。。超人流水账

  5. HACKCRAFT -#5

    果真比较高级…

  6. 万戈 -#6

    可以用PHP的正则代替这段脚本吗?

    • QiQiBoY --#1

      @万戈
      不可能在后台处理的,因为在存往数据库时,各种html标签就已经被过滤了,所以只能在前台提交前处理。,。。
      另外,我自认正则还行,而且js的正则比php的更强大,JavaScript的正则我想不出来。。。 :grin:

  7. 小邪 -#7

    myField.value的值是随着输入框里面的内容变的 ?
    还是按照 var myField 的时候,那个时候的值哇? O(∩_∩)O

    • QiQiBoY --#1

      @小邪

      小邪 :

      myField.value的值是随着输入框里面的内容变的 ?

      什么意思?看不懂。。。。myField.value在这儿就是评论框中的内容,有需要处理时,会将内容清空,然后再将处理过的数据填进来。。。
      处理是发生在表单提交时。。。

    • 小邪 --#2

      @QiQiBoY
      喔喔,呵呵,谢啦,懂鸟 ~~
      就是myField.value的值是实时与评论框相同的 ~

    • QiQiBoY --#3

      @小邪
      不,不是实时的,在点击发表按钮提交前并无任何数据处理。。。。这之前函数都未执行,页面上还不存在myField.value这个值。。。。你可以用js调试工具测试一下。。

    • 小邪 --#4

      @QiQiBoY
      喔,呵呵,了解鸟 ~
      就是,定义了myField之后 ~
      修改myField.value的值,就等于修改评论框里面的内容一样吧 ~

    • QiQiBoY --#5

      @小邪
      myField是个对象,通过getElementById方法,它其实就是指代评论框了。。。所以修改它的值就是修改评论框的值。。。

  8. 流年 -#8

    来,试一试
    <?php echo "test" ?>

  9. 流年 -#9

    看看这个
    $(document).ready(function(){alert("abc");});

  10. 小邪 -#10


    <?php echo 'hello world'; ?>

  11. mice -#11

    技术哥..路过了… :!:

  12. winy -#12

    改成pre我觉得更实用吧,还能用上高亮

  13. 海天 -#13

    你现在的评论框是越来越强悍了啊

  14. Page -#14

    测试一下
    try:
    userList = paginator.page(page)
    except(EmptyPage,InvalidPage,PageNotAnInteger):
    userList = paginator.page(1)
    #– 显示范围 –#
    if page >= after_range_num:
    page_range = paginator.page_range[page-after_range_num:page+bevor_range_num]
    else:
    page_range = paginator.page_range[0:int(page)+bevor_range_num]
    return render_to_response(“list.html”,locals())

    • QiQiBoY --#1

      @Page
      一般wordpress只过滤html符号,这种代码你不会过滤,可以直接显示。。

  15. 阿邙 -#15

    评论框折腾帝 不是盖得哈

  16. MOPVHS -#16

    :arrow: 鼓掌…收藏先~~~

  17. A.shun -#17

    一直是手动转义

    这个方便访客插入代码啊,可以折腾

  18. MOPVHS -#18
  19. zwwooooo -#19

    你给我的js我稍微改了一下,就是贴代码然后选中点击code,反正用这个就自己多

    • QiQiBoY --#1

      @zwwooooo
      我看过你改的了。。我现在弄得是自动的,只要预先将代码写在规定的标签中,在提交时就会自动转换,在提交前任何时候都可以再去修改编辑
      而手动的在你转换过之后如果想要再编辑、修改某些地方就会很混乱了。。

    • zwwooooo --#2

      @QiQiBoY
      嗯,稍后换为你这个,方便

  20. 阿七 -#20

    评论好炫的说。。

  1. 博客加入若干Ajax效果

    [...] 让你的评论框自由粘贴代码 [...]

  2. 【SimPaled篇】Introduce My Blog Theme For You

    [...] 发表评论部分支持隐藏访客、管理员信息,实时显示gravatar头像,输入字数统计等,文本输入框支持系列编辑器,自由粘贴代码。——注:实时头像参考《Email输入框处实时显示gravatar头像+email验证+动态信息提醒》,编辑器参考《为评论框添加文字格式化编辑器》,自由粘贴代码参考《让你的评论框自由粘贴代码》,字数统计参考《评论框的简单计数器(无需改动模板,附带输入字数限制功能)》 [...]

Leave a Reply

Hi , say something.

  • :?:
  • :razz:
  • :sad:
  • :evil:
  • :!:
  • :smile:
  • :oops:
  • :grin:
  • :eek:
  • :shock:
  • :???:
  • :cool:
  • :lol:
  • :mad:
  • :twisted:
  • :roll:
  • :wink:
  • :idea:
  • :arrow:
  • :neutral:
  • :cry:
  • :mrgreen: