快速业务通道

JavaEye3.0开发手记之二 - rails的UTF-8支持造成的正则表达式问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

JavaEye3.0开发手记之二 - rails的UTF-8支持造成的正则表达式问题

时间:2011-11-20 javaeye robbin

rails的ActionView::Helpers::TextHepler模块提供了很多实用的方法,这些方法对于论坛类应用非 常有用,例如 auto_link这个方法可以自动检测传入字符串当中的URL,并将其自动转换为HTML超链接格 式,这对于显示帖子的内容来说很不错。

但是在开发JavaEye3.0的时候,却发现auto_link有bug,一旦帖子当中的URL后面紧跟中文的话, auto_link就会把URL后面所有的中文当做URL的一部分进行格式化,直到碰到空格为止,例如:

引用

http://www.javaeye.com网站很不错

就会被格式化为:

引用

<a href="http://www.javaeye.com网站很不错">http://www.javaeye.com网站很不错 </a>

看来得到rails的源代码里找答案了。

打开netbeans,敲快捷键Ctrl+O,在弹出窗口输入:texthelper,回车,netbeans已经帮我打开了 text_helper.rb源代码,通过Navigator窗口,很方便的定位到auto_link方法,仔细看一下,原来主要是 这个正则表达式在起作用:

Ruby代码

AUTO_LINK_RE = %r{ 
        (             # leading text 
         <\w+.*?>|        # leading HTML tag, or 
         [^=!:''"/]|        # leading punctuation, or 
         ^            # beginning of line 
        ) 
        ( 
         (?:https?://)|      # protocol spec, or 
         (?:www\.)        # www.* 
        ) 
        ( 
         [-\w]+          # subdomain or domain 
         (?:\.[-\w]+)*      # remaining subdomains or domain 
         (?::\d+)?        # port 
         (?:/(?:(?:[~\w\+%-]|(?:[,.;:][^\s$]))+)?)* # path 
         (?:\?[\w\+%&=.;-]+)?   # query string 
         (?:\#[\w\-]*)?      # trailing anchor 
        ) 
        ([[:punct:]]|\s|<|$)    # trailing text 
        }x unless const_defined?(:AUTO_LINK_RE)

JavaEye3.0开发手记之二 - rails的UTF-8支持造成的正则表达式问题(2)

时间:2011-11-20 javaeye robbin

但这个正则表达式上看下看,左看右看都没有啥问题阿。于是把这个正则表达式拷贝出来,放在一个 ruby文件里面test.rb,一点点单独调试,但怎么调试都正常,即使把上面那个URL放进去,也可以正常截 断中文。

难道是因为rails做了手脚?为了验证这一点,在test.rb前面加上如下内容:

Ruby代码

ENV["RAILS_ENV"] = "development" 
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

再运行test.rb,果然!中文又被包括进去了,看来就是rails做了手脚。

再回过头仔细看这个正则表达式,只有[\w]和字符串处理有关系,为了验证这一点,我们做如下试验 :

创建一个char.rb文件,内容如下:

Ruby代码

def name 
 return "范凯" 
end

请注意!该文件保存格式请必须使用UTF-8!!

然后打开irb,进行如下交互:

引用

irb(main):001:0> load "char.rb" 
=> true 
irb(main):002:0> name 
=> "\350\214\203\345\207\257" 
irb(main):003:0> name.match /[A-Z

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号