AutoPagerizeのSITEINFOのurlの正規表現(エスケープ)について
WedataのSITEINFOで正規表現を覚えたつもりになっている人に警鐘を鳴らすエントリー。
AutoPagerizeはSITEINFOのurlとlocation.hrefがmatchするかどうか判定しています。
まずはmatchおさらい。→String#match - MDC
matchに文字列が渡された場合、RegExpオブジェクトに暗黙的に変換されます。
matchに正規表現を渡す場合
var url = "http://wwwx.fujitv.co.jp/zoo/blog/index.jsp?cid=233"; url.match(/^http:\/\/wwwx\.fujitv\.co\.jp\/zoo\/blog\/index\.jsp\?cid=233/); //マッチする。
matchに文字列を渡す場合
>if(location.href.match('chart.php') ||
String#matchに文字列を渡すと正規表現として解釈されるので、'chart- php'.match('chart.php')もマッチしてしまい意図した結果になりません。文字列で渡す場合は、\のエスケープも必要になるので str.match('chart\\.php')とします。
id:javascripter
なので、文字列として渡す場合の正しい書き方は、
var url = "http://wwwx.fujitv.co.jp/zoo/blog/index.jsp?cid=233"; url.match("^http:\/\/wwwx\\.fujitv\\.co\\.jp\/zoo\/blog\/index\\.jsp\\?cid=233"); //マッチする。
あれ?AutoPagerizeのSITEINFOはそんな書き方してないよ!って思った人は危険。*1
ブコメを受けて追記
var url = "http://wwwx.fujitv.co.jp/zoo/blog/index.jsp?cid=233"; url.match("^http://wwwx\\.fujitv\\.co\\.jp/zoo/blog/index\\.jsp\\?cid=233");
文字列で渡す場合、スラッシュのエスケープは無意味。
Wedataは特殊な環境(SITEINFOの正規表現はエスケープする前のもの)
http://wedata.net/items/27505?rev=33989
AutoPagerizeはこのページに表示されているurlなどをそのまま処理しているのではありません。Wedata側で自動的にエスケープ処理したものをAutoPagerizeに渡しています。(リンク先の"JSON"で確認ができる)
id:drry先生が添削してくれてるけど、あれはWedata用に最適化されたものなので学習者は注意が必要です。
(今更)覚えたこと
- Wedataは特殊な環境(このエントリーを書き始めるまで気づかなかった。)
- matchに文字列を渡したほうが簡潔に書けると思い込んでいたが逆だった。
*1:さっきまでの自分