- 浏览: 4826321 次
- 性别:
- 来自: 上海
博客专栏
-
robbin谈管理
浏览量:137498
文章分类
最新评论
-
xly1981:
领导者是团队的灵魂。深入一线的过程,包括代码review,能帮 ...
robbin谈管理:改造团队的经验(2) -
jiehuangwei:
像这种总结比较性的ppt文档可以多发啊
Web并发模型粗浅探讨 -
linux1308:
看完学习到了很多东西,感谢推荐!
推荐一篇很好的RoR部署方案性能评测 -
zweite:
直接对搜索的结果进行缓存是不是会更快一点呢
漫谈应用缓存的命中率问题 -
kaogua:
现在已经是ruby2.0了, 不知道这个的效率是怎么样的, 是 ...
Ruby作为服务器端应用已经成熟了
rails的ActionView::Helpers::TextHepler模块提供了很多实用的方法,这些方法对于论坛类应用非常有用,例如auto_link这个方法可以自动检测传入字符串当中的URL,并将其自动转换为HTML超链接格式,这对于显示帖子的内容来说很不错。
但是在开发JavaEye3.0的时候,却发现auto_link有bug,一旦帖子当中的URL后面紧跟中文的话,auto_link就会把URL后面所有的中文当做URL的一部分进行格式化,直到碰到空格为止,例如:
就会被格式化为:
看来得到rails的源代码里找答案了。
打开netbeans,敲快捷键Ctrl+O,在弹出窗口输入:texthelper,回车,netbeans已经帮我打开了text_helper.rb源代码,通过Navigator窗口,很方便的定位到auto_link方法,仔细看一下,原来主要是这个正则表达式在起作用:
但这个正则表达式上看下看,左看右看都没有啥问题阿。于是把这个正则表达式拷贝出来,放在一个ruby文件里面test.rb,一点点单独调试,但怎么调试都正常,即使把上面那个URL放进去,也可以正常截断中文。
难道是因为rails做了手脚?为了验证这一点,在test.rb前面加上如下内容:
再运行test.rb,果然!中文又被包括进去了,看来就是rails做了手脚。
再回过头仔细看这个正则表达式,只有[\w]和字符串处理有关系,为了验证这一点,我们做如下试验:
创建一个char.rb文件,内容如下:
请注意!该文件保存格式请必须使用UTF-8!!
然后打开irb,进行如下交互:
请注意标记为红色的行,在ruby的内存中,中文字符串的编码使用的是unicode格式,中文字符串不能够匹配到/[\w]+/上面去,而/[A-Za-z0-9_]+/与/\w+/是同义词。
好了,现在启动rails的环境:
哈哈,水落石出了!!由于rails的ActiveSupport的引入,在ruby的内存当中,字符串被转换为UTF-8格式了(显示乱码是因为我的Windows操作系统是GBK编码),而中文字符串居然可以匹配/\w+/了!
我们可以看到,由于rails在内存当中以UTF-8格式操作中文字符串,而不是ruby默认的unicode格式,这就导致了正则表达式的歧义:/[A-Za-z0-9_]+/不能匹配中文,但是/\w+/可以匹配中文,但实际上在ruby当中,这两个正则表达式本应该是同义词。
明白了问题的根源,就清楚了如何去解决auto_link的bug,修改正则表达式和相关方法,将\w替换为A-Za-z0-9,并将其放入你的rails项目的application_helper.rb当中,这样就可以在项目启动以后覆盖rails系统类库的定义:
OK,搞定了,这下auto_link可以正确截断中文了。
不就是FCK编辑器吗!
应该是转成编码形式吧?
http://www.iteye.com/?keyword=%CD%F8%D5%BE%BA%DC%B2%BB%B4%ED
但是在开发JavaEye3.0的时候,却发现auto_link有bug,一旦帖子当中的URL后面紧跟中文的话,auto_link就会把URL后面所有的中文当做URL的一部分进行格式化,直到碰到空格为止,例如:
引用
http://www.iteye.com网站很不错
就会被格式化为:
引用
<a href="http://www.iteye.com网站很不错">http://www.iteye.com网站很不错</a>
看来得到rails的源代码里找答案了。
打开netbeans,敲快捷键Ctrl+O,在弹出窗口输入:texthelper,回车,netbeans已经帮我打开了text_helper.rb源代码,通过Navigator窗口,很方便的定位到auto_link方法,仔细看一下,原来主要是这个正则表达式在起作用:
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)
但这个正则表达式上看下看,左看右看都没有啥问题阿。于是把这个正则表达式拷贝出来,放在一个ruby文件里面test.rb,一点点单独调试,但怎么调试都正常,即使把上面那个URL放进去,也可以正常截断中文。
难道是因为rails做了手脚?为了验证这一点,在test.rb前面加上如下内容:
ENV["RAILS_ENV"] = "development" require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
再运行test.rb,果然!中文又被包括进去了,看来就是rails做了手脚。
再回过头仔细看这个正则表达式,只有[\w]和字符串处理有关系,为了验证这一点,我们做如下试验:
创建一个char.rb文件,内容如下:
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-Za-z0-9_]+/
=> nil
irb(main):004:0> name.match /\w+/
=> nil
=> true
irb(main):002:0> name
=> "\350\214\203\345\207\257"
irb(main):003:0> name.match /[A-Za-z0-9_]+/
=> nil
irb(main):004:0> name.match /\w+/
=> nil
请注意标记为红色的行,在ruby的内存中,中文字符串的编码使用的是unicode格式,中文字符串不能够匹配到/[\w]+/上面去,而/[A-Za-z0-9_]+/与/\w+/是同义词。
好了,现在启动rails的环境:
引用
$ ./script/console
Loading development environment.
>> load "char.rb"
=> []
>> name
=> "鑼冨嚡"
>> name.match /[A-Za-z0-9_]+/
=> nil
>> name.match /\w+/
=> #<MatchData:0x474693c>
Loading development environment.
>> load "char.rb"
=> []
>> name
=> "鑼冨嚡"
>> name.match /[A-Za-z0-9_]+/
=> nil
>> name.match /\w+/
=> #<MatchData:0x474693c>
哈哈,水落石出了!!由于rails的ActiveSupport的引入,在ruby的内存当中,字符串被转换为UTF-8格式了(显示乱码是因为我的Windows操作系统是GBK编码),而中文字符串居然可以匹配/\w+/了!
我们可以看到,由于rails在内存当中以UTF-8格式操作中文字符串,而不是ruby默认的unicode格式,这就导致了正则表达式的歧义:/[A-Za-z0-9_]+/不能匹配中文,但是/\w+/可以匹配中文,但实际上在ruby当中,这两个正则表达式本应该是同义词。
明白了问题的根源,就清楚了如何去解决auto_link的bug,修改正则表达式和相关方法,将\w替换为A-Za-z0-9,并将其放入你的rails项目的application_helper.rb当中,这样就可以在项目启动以后覆盖rails系统类库的定义:
AUTO_LINK_RE = %r{ ( # leading text <\w+.*?>| # leading HTML tag, or [^=!:'"/]| # leading punctuation, or ^ # beginning of line ) ( (?:https?://)| # protocol spec, or (?:www\.) # www.* ) ( [-0-9A-Za-z_]+ # subdomain or domain (?:\.[-0-9A-Za-z_]+)* # remaining subdomains or domain (?::\d+)? # port (?:/(?:(?:[~0-9A-Za-z_\+%-]|(?:[,.;:][^\s$]))+)?)* # path (?:\?[0-9A-Za-z_\+%&=.;-]+)? # query string (?:\#[0-9A-Za-z_\-]*)? # trailing anchor ) }x unless const_defined?(:AUTO_LINK_RE) def auto_link_urls(text, href_options = {}) extra_options = tag_options(href_options.stringify_keys) || "" text.gsub(AUTO_LINK_RE) do all, a, b, c = $&, $1, $2, $3 if a =~ /<a\s/i # don't replace URL's that are already linked all else text = b + c text = yield(text) if block_given? %(#{a}<a href="#{b=="www."?"http://www.":b}#{c}"#{extra_options}>#{text}</a>) end end end
OK,搞定了,这下auto_link可以正确截断中文了。
评论
15 楼
erikchang
2008-01-05
zhangyqpost 写道
请问一下如图的Rich Editor是怎么实现的.怎么用,在哪可以下载到.
不就是FCK编辑器吗!
14 楼
bookong
2007-11-19
庄严 写道
有的URL里带中文参数的会怎么样
比如:http://www.iteye.com?keyword=网站很不错
我以前就这样传过参数
比如:http://www.iteye.com?keyword=网站很不错
我以前就这样传过参数
应该是转成编码形式吧?
http://www.iteye.com/?keyword=%CD%F8%D5%BE%BA%DC%B2%BB%B4%ED
13 楼
Stainlesssteel
2007-11-09
FCKeditor 不支持safari
12 楼
zhangyqpost
2007-11-09
请问一下如图的Rich Editor是怎么实现的.怎么用,在哪可以下载到.
11 楼
gavinlau
2007-09-09
10 楼
myxex
2007-08-30
若是用restful来架构javaeye3.0,很期待此版本早点出来,url的设计好借鉴借鉴。。
9 楼
hongkong
2007-08-30
老大是否用restful来架构javaeye3.0?强烈关注中
8 楼
zhang2124
2007-08-27
学习中
7 楼
庄严
2007-08-27
有的URL里带中文参数的会怎么样
比如:http://www.iteye.com?keyword=网站很不错
我以前就这样传过参数
比如:http://www.iteye.com?keyword=网站很不错
我以前就这样传过参数
6 楼
simohayha
2007-08-24
robbin
你的这篇文章,csdn怎么都没属你的名字呀?
http://news.csdn.net/n/20070706/106176.html
你的这篇文章,csdn怎么都没属你的名字呀?
http://news.csdn.net/n/20070706/106176.html
5 楼
dykl001
2007-08-23
学习。。。。
4 楼
cvu
2007-08-22
虽然用不到这条技巧,这个挖的过程还是很精彩的。
3 楼
s00n
2007-08-22
我也遇到过类似问题,看了代码没未果。还是robbin找到了问题的答案
2 楼
pig345
2007-08-22
佩服!
1 楼
tommyjian
2007-08-22
辛苦了!!!
发表评论
-
《松本行弘的程序世界》推荐序
2011-07-21 13:47 15311在流行的编程语言中,ruby是一个比较另类的存在,这是因为大多 ... -
从Rails聊聊小公司的研发团队建设
2011-03-23 10:49 37234首先分享一点数据吧: JavaEye的PV到了140万了,一 ... -
Ruby作为服务器端应用已经成熟了
2009-11-17 14:55 15980JavaEye网站在过去的Ruby on rails实践当中, ... -
基于资源的HTTP Cache的实现介绍
2009-09-05 00:27 17079我们都知道浏览器会缓 ... -
请注意Rails2.3自带的memcache-client有性能问题
2009-03-23 18:05 14516Rails2.3版本发布了,这个版本内部的改动非常大,相关介绍 ... -
监视Rails进程内存泄漏的技巧
2008-12-30 21:56 10975Rails应用比较容易遇到的两类性能问题:一类是Rails执行 ... -
ruby MBARI大补丁性能评测报告
2008-12-23 12:19 5075JavaEye之前的新闻ruby内存泄漏的罪魁祸首 - 幽灵指 ... -
在top监视窗口显示Rails当前正在执行的请求URL
2008-12-01 14:15 9864这是一个从PragDave的博客上面学来的技巧,很实用,很co ... -
对Ruby VM的GC的思考
2008-09-02 23:41 8988Ruby虽然是动态脚本语言 ... -
推荐一篇很好的RoR部署方案性能评测
2008-07-08 11:55 9684今年年初的时候,我写了一篇RoR部署方案深度剖析的文章,分析了 ... -
Ruby和Rails的缺点
2008-06-25 21:08 17409有人说,robbin你说了那么多RoR的优点,你啥时候说说Ro ... -
Skynet --- ruby的类Google Map/Reduce框架
2008-06-02 00:39 8303Skynet是一个很响亮的名 ... -
rmmseg-cpp - 简洁高效的ruby中文分词程序
2008-05-27 00:47 11243我在前一篇文章向大家 ... -
使用libmmseg实现Ruby的中文分词功能
2008-05-24 21:43 11339用Ruby on Rails开发web2.0网站的人都知道,r ... -
mod_rails尝鲜
2008-04-13 14:32 8086Passenger(俗称mod_rails)是 ... -
Lighttpd和RoR安装配置的疑难解答
2008-03-07 11:09 14868之前写过一篇在Linux平 ... -
JavaEye网站的RoR性能优化经验谈
2008-01-20 16:11 18471JavaEye网站从2006年9月11 ... -
RoR部署方案深度剖析
2008-01-14 03:10 14811RoR的部署方案可谓五花八门,有Apache/Fastcgi方 ... -
RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能
2008-01-12 17:45 10269传统的Web服务器在处理文件下载的时候,总是先读入文件内容到应 ... -
Ruby为什么会受程序员的欢迎?
2008-01-07 20:08 15755孟岩最近写了一篇博客 ...
相关推荐
### JavaEye3.0开发手记之开发环境搭建详解 #### 一、开发环境搭建概述 随着JavaEye3.0开发计划的启动,本篇文章将详细介绍如何为该项目搭建高效的开发环境。开发过程中不仅需要考虑软件的选择,还需要针对操作...
用法java -jar QRe.jar 运行环境:...支持匹配处高亮显示 2.支持group 3.支持多次匹配 <br>不废话了,请看截图: http://www.javaeye.com/topics/download/0238851c-019f-358f-a72e-ce54e0bede90<br>
* Summary of regular-expression constructs 正则表达式结构简介: * Construct Matches * Characters 字符: * x The character x x 字符 x * \\ The ...
- Sun的Regexpr实现可能成为讨论的焦点,因为正则表达式在文本处理和数据验证中广泛使用,其效率和兼容性是开发者关心的问题。 12. **ORM框架的探讨** - ORM(对象关系映射)工具如Hibernate和MyBatis,简化了...
### JavaEye2.0_on_rails:敏捷Web开发实践与Ruby on Rails的应用 #### 敏捷软件开发方法 - **背景**:传统软件工程方法在实际应用中面临着项目延期、成本超支以及软件质量不高的问题。为了克服这些挑战,业界提出...
### Ruby中的正则表达式详解 #### 一、引言 在编程语言Ruby中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于模式匹配、搜索与替换字符串等功能。Ruby采用`//`作为正则表达式的边界标记,使得...
NULL 博文链接:https://ago520.iteye.com/blog/814571
NULL 博文链接:https://ago520.iteye.com/blog/754087
JavaEye新闻月刊2009年3月第13期内容涉及了当时软件开发领域内的一系列重要话题,包括IBM拟收购Sun Microsystems公司的新闻报道、Java社区对此的看法以及各种编程语言、开发工具和技术的新动态。 首先,新闻月刊...
### 关于用Oracle的DBMS_XMLDOM导出XML文档编码格式UTF-8的问题总结 在处理Oracle数据库中使用DBMS_XMLDOM模块创建并导出XML文档时,经常会遇到有关文档编码格式的问题,尤其是如何确保导出的XML文档采用UTF-8编码...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了深入学习Java,了解并掌握其API(应用程序接口)以及使用高效的开发工具是至关重要的。下面,我们将详细探讨Java学习网站、API手册、...
在Linux平台上安装和配置Ruby on Rails详解 - rails - Ruby - JavaEye论坛.htm
【JavaEye论坛热点推荐 - 2009年09月 - 总第16期】 这期JavaEye论坛的热点推荐涵盖了多个Java相关的技术话题,包括JDK7的新特性、HTTP缓存、Android开发、Java编程面试问题、Hibernate缓存、网页数据存储设计、热...
VB6不内置支持正则表达式,但可以通过引入Microsoft的VBA RegEx库来实现。 3. **模块(Module)**:在VB6项目中,`Module1.bas`可能包含实现HTML压缩逻辑的函数或子过程。模块可以存放全局变量、函数和过程,它们在...
19. Ruby on Rails:Ruby on Rails是一个流行的Web开发框架,文中探讨了其在企业开发、嵌入式开发中的应用,以及工作流实现。 20. AJAX技术:包括ExtJS基础教程和jQuery图片循环效果,展示了AJAX如何提升用户体验。...