JavaEye3.0開発手記の2-railsのUTF-8サポートによる正規表現の問題


railsのActionView::Helpers::TextHeplerモジュールは、auto_などのフォーラムクラスアプリケーションに非常に役立つ多くの実用的な方法を提供しています.linkという方法では、入力文字列のURLを自動的に検出し、HTMLハイパーリンクフォーマットに自動的に変換することができ、投稿の内容を表示するのに役立ちます.
でもJavaEye 3を開発しています.0の時、auto_を発見リンクにバグがあり、投稿中のURLの後ろに中国語が続くとauto_linkはURLの後ろのすべての中国語をURLの一部としてフォーマットし、スペースにぶつかるまで、例えば:
参照
http://www.iteye.comサイトはいいですね
次のようにフォーマットされます.
参照
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文件。rb,虽然每个单独戴包,但是怎样戴包都正常,即使加入上的URL,也可以正常遮断中国语.毕竟rails做了手足吗?为了验证这个,在test上rb之前加入以下内容。 ENV["RAILS_ENV"] = "development" require File.expand_path(File.dirname(__FILE__) + "/../config/environment") 再实行rb,果然!中国语也包含了,比赛好像做了手足.回顾这个正规表现,为了验证[w]只有与文字列处理相关的事情,进行以下实验。制作char的rb文件,内容如下所述. def name return「範凱」 end请注意.这个文件保存手机需要使用UTF-8!!接下来打开irb,进行了接下来的采访。参照irb(main):001:0>load"char.rb"=>true irb(main):002:0>name=>"350214203345207257"irb(main):003:0>name.match/[A-Za-z0-9_]+/=> nil irb(main):004:0> name.match/w+/=>nil红色的行被标记了注意.ruby的梅莫里,中国语文字列的符号化中使用unicode形式.中国语字列不一致/[w]+/[A-Za-z 0-9_]+//w+/和同義語。那么,我们开始rails的环境.参照$./script/console Loading development environment. >>load"char.rb"=>[]>>name=>「どれだけ富みますか」>>name.match/[A-Za-z0-9_]+/=> nil >>  name.match/w+/=>#是,水落后石出来!!由于rails的ActiveSupport引入,ruby的梅莫里文字列被UTF-8形式变换(文字化,我的Windows歌剧系统为GBK符号化),中国语的文字列为//w+/可以马上!rails不是ruby的デフォルト的unicode手机,而是在梅莫里内用UTF-8形式操作中国语字列,所以明白了正规表现的暧昧度:/[A-Za-z 0-9_]+/虽然不能一致中国语,但/w+/可以一致中国语,但实际上ruby,这两个正规表现应该是同義語.如果知道问题的根源,auto_我知道解决方法.link的橄榄球修正了与正规表现相关方法,把w换成A-Za-z 0-9,换成rails项目的应用程序_进去。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可以正确遮断中国语.