Welcome 微信登录

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

JavaEye3.0开发手记之二 - rails的UTF-8支持造成的正则表达式问题2011-11-20 javaeye robbinrails的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)