Ruby 正規表現 先読みの例
# aを含む1文字〜4文字の文字列
re = /^(?=.*a).{1,4}$/#特殊文字を含まない4文字のパスワード
re = /^(?!.*[\W_]).{4}$/
Rails3.x でASCII 8bitで渡ってきたparamsハッシュパラメータのキーと値をUTF-8化するメソッド
def encodeToUtf8(params)hash = {}
params.map do |key, val|
dupKey = key.dup unless key.instance_of? NilClass
dupVal = val.dup unless val.instance_of? NilClassdupKey.force_encoding('UTF-8') if key.instance_of? String
dupVal.force_encoding('UTF-8') if val.instance_of? Stringhash[dupKey] = dupVal
end
hash
end
クライアント側でのJSONの作成と解析
クライアント側でJSONの作成と解析を行う場合、JSONの作成者でもあるDouglas Croockford氏が作成した
JavaScriptライブラリを使用するのがよいだろう。以下のURLよりダウンロードできる。
http://www.JSON.org/js.html
JavaScriptオブジェクトをシリアライズする方法は以下の通り。
var jsonObj = JSON.stringify({name:'山田太郎', age: 29});
このスクリプトはコードをサニタイズしてくれるので、これを使用するのがよいだろう。
var obj = JSON.parse(jsonObj);
jQueryオブジェクトから、素のDOMオブジェクトを取得する方法
jQuery(要素s)は、たとえ要素が一つの場合でも、配列として持っている。
jQuery().get(index)で、もとのDOMオブジェクトが取得できる。
jQuery('li').get(0)なら、要素
jQuery().get()にはショートカットがあり、通常はそちらを使用することになる。
ショートカットは、jQuery(要素)[index]である。
これの使いどころは、色々考えられるが、要素セットの比較などに使えるのではなかろうか。
jQuery(要素)は、同じ種類の要素をパラメータにとっても、jQueryが呼ばれば時点で、新しいjQueryオブジェクトが作成されるので
==演算子で比較してもfalseが返ってきてしまう。
そこで、DOMオブジェクトに変換したあとで、==演算子で比較すると、同じ種類の要素の場合、trueを返してくれることになる。
以下はその例である。
//テーブルの項目をクリックしたときのイベント
var textbox;
$('td').click(
function(event){ //textboxのjQueryオブジェクトが存在し、且つ「textboxのDOMオブジェクト」と「イベントが
//発生したDOMオブジェクト」が異なれば、テキストボックスを普通のセルに戻す。
//この設定は、テキストボックス内のカーソルの移動を、マウスクリックを使って
//可能にする為である。
if(textbox && textbox[0] != $(event.target)[0]) textbox.replaceWith(textbox.val());
$(event.target).html('');
textbox = $('#edit_item');
textbox.focus();
textbox.css({width:$(event.target).width() + 'px'});
jQueryでajaxのリクエストを投げた時の、FirefoxとSafari,IEの違い
jQueryでは、AJAXを利用するときに、jQuery.ajax()関数を利用する。
ajax関数のパラメータには、javascriptのオブジェクトを設定するが、そのプロパティには以下のものを指定する。
- url:リクエスト先のURLを指定する
- type:GET or POST
- cache:ブラウザ、プロキシ、サーバーのキャッシュを返すかどうかの真偽値
- data:サーバーへ送信するデータ
- dataType:サーバーから受信するデータのタイプ
- error:エラー時のコールバックメソッド
- success:成功時のコールバックメソッド
- complete:error時、又はsuccess時のコールバックメソッドが走った後に起動するコールバックメソッド
これらのパラメータでFirefoxとSafari,IE で異なる動作をするものがある。
dataTypeである。
例えば、dataTypeに'text'を指定するとしよう。
これはサーバーからプレーンテキストが送られてくることを期待することになる。
しかし、もしサーバーから何もデータが送られてこなかったら、どうだろう。
ここでブラウザの違いが表面化する。
Firefoxの場合は、サーバーから何も送られて来なかったとしても、エラーは起きない。
しかし、SafariやIEでは、エラーが発生し、エラー時のコールバックメソッドで補足されることになる。
以下は、サーバー側をRuby On Railsで書いたときのエラー発生時のログである。
ActionView::MissingTemplate (Missing template books/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:text, :"*/*"], :locale=>[:en, :en]} in view paths "/Users/koichi/Documents/Rails/manage/app/views"):
Rendered /opt/local/lib/ruby1.9/gems/1.9.1/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (1.5ms)
:formats=>[:text, :"*/*"]のところで、textを送信していないと怒られているようだ。
更新処理などで、特にクライアント側でデータを受け取る必要がないときには、dataTypeをパラメータとして指定しないのがよいだろう。
Ruby1.92 正規表現で日本語にマッチ方法
結論からいうと、これで解決しました。
[ぁ-んァ-ヴ一-龠ーア-ン゚゙・ーャュョァ-ォッ]+
ほんと、日本語の扱いは難しい。
「ア」「ア」「ァ」「ァ」これらの"ア"は、全て異なるアです。
さらに当然の事ながら、全角のハイフンと半角のハイフンは異なります。⇒「ー」「ー」
さらに、パピプペポとかザジズゼゾの「゚」「゙」は、夫々独立した文字の扱いを受けます。
また、「バッタ」と「バッタ」の「ツタヤ」と「ツタヤ」それぞれの「ツ」は全て異なる扱いを受けます。
そして、Ruby1.92では、さらに正規表現の比較が厳密です。
例えば、ある文字列がWindows-31Jのエンコーディングを持つ場合、正規表現に/ホニャララ/sを指定して、
正規表現をShift_JISとして、比較しようとしても、「Windows-31J」と「Shift_JIS」を異なる
エンコーディングとして扱う為、エラーになります。
じゃあ、どうするかというと、最終的には以下のようにしました。
line.encode!('UTF-8')
if line =~ /(\w+?)\.DBM\s+([\wぁ-んァ-ヴ一-龠ア-ンーーャュョァ-ォッ゙゚]+)/u
end
lineは「Windows-31J」として、ファイルから読み込まれたものですが
String#encode!メソッドで、破壊的にUTF-8に変換しています。
さらに正規表現では、/ホニャララ/u とすることによって、UTF-8として検査するようにしています。
ただ、これでも恐らく抜けがあるんじゃないかなあ。
日本語をモレなくマッチさせる正規表現として、もっと良い指定方法が
教えて下さいな。