コードの要約

このQ&Aのポイント
  • 数値の圧縮とデコードをするコードの解説
  • 正規表現を使用して特定のパターンを置換する処理が行われています
  • センセーショナルなタイトルを生成する処理が含まれています
回答を見る
  • ベストアンサー

このコードは何をやっているのか

data[i]には0~20位の数値が適当に入っている感じです function create(){ text += (data[i]+10).toString(31).toUpperCase(); while (text.match(/(\D)\1{8}/)) { text = text.replace(/(\D)\1{8}/,RegExp.$1+'9'); } while (text.match(/(\D)\1{7}/)) { text = text.replace(/(\D)\1{7}/,RegExp.$1+'8'); } while (text.match(/(\D)\1{6}/)) { text = text.replace(/(\D)\1{6}/,RegExp.$1+'7'); } while (text.match(/(\D)\1{5}/)) { text = text.replace(/(\D)\1{5}/,RegExp.$1+'6'); } while (text.match(/(\D)\1{4}/)) { text = text.replace(/(\D)\1{4}/,RegExp.$1+'5'); } while (text.match(/(\D)\1{3}/)) { text = text.replace(/(\D)\1{3}/,RegExp.$1+'4'); } while (text.match(/(\D)\1{2}/)) { text = text.replace(/(\D)\1{2}/,RegExp.$1+'3'); } while (text.match(/(\D)\1/)) { text = text.replace(/(\D)\1/,RegExp.$1+'2'); } } function load(text){ text = text.substring(text.indexOf("0")+1); while (text.match(/(\D)([2-9])/)) { text = text.replace(/(\D)([2-9])/,load2(RegExp.$1,RegExp.$2)) } j=1; for(i=0;i<text.length;i++) { cdata[j] = "ABCDEFGHIJKLMNOPQRSTU".indexOf(text.charAt(i)); j=j+1; } } function load2(arg1,arg2) { code = arg1; for (i=1;i<arg2;i++) { code += arg1; } return code; } 数値配列の圧縮とデコードをしているようですが 主に正規表現のあたりがどういう事をやっているのかが理解出来ません

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> while (text.match(/(\D)\1{8}/)) { text = text.replace(/(\D)\1{8}/,RegExp.$1+'9'); } \D 数字以外の1文字。 () カッコで囲むと、正規表現を使った後でRegExp.$1などで使えるようになる。 カッコの組が2つ以上あるときは、それぞれRegExp.$2、RegExp.$3、、、となる。 \1 その正規表現中のカッコの組の内容。 このスクリプトでは(\D)が該当するので、数字以外の1文字が入る。 \1{8} 大カッコで囲むと直前にマッチした文字が連続することを意味する。 これは\1(上記の理由により”数字以外の文字”)が8個連続で続く場合」という意味。 (\D)\1{8} となっているため、数字以外の同じ文字が9個(1個と、8個連続の組み合わせ=9連続)で続く場合、 RegExp.$1+'9'だから、「その1文字 + '9'」 に変換する。 \D、つまり「数字以外」には記号も含まれるが、 あらかじめ.toString(31)により31進数(0-9A-U、toUpperCase()により大文字)に変換しているから、 この文字列に記号は含まれず、結果としてアルファベットのみが置換の対象となる。 例 31進数で AA -> 'A2' 31進数で BBB -> 'B3' 31進数で CCCCC -> 'C5' 10進数の20以下(最初に+10しているため)なら31進数では1桁ですから、実質、これらの圧縮は行われません。 20以下の数値変換をするなら、これで十分だと思いますが。。。 圧縮処理はしなくても、1バイトですから。 num = 20; str=num.toString(20); // 数値(数字)を20進数の文字列に変換 num=parseInt(str, 20); // 20進数の文字列を数値に変換 というか、この逆変換処理は、22以上の数字は正確に元の数値に戻らないと思います。 個人的に「+10して変換、アルファベット部分だけを逆変換の対象にする」というアルゴリズムは今後の参考になりそうなので、勉強させてもらいました。

関連するQ&A

  • このコードを処理速度向上させることはできますか?

    このコードを処理速度向上させることはできますか? <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"> //<![CDATA[ function className(str){ var alltag = document.getElementsByTagName("*"); var ary = []; for(var i=0;i<alltag.length;i++){ if("."+alltag[i].className == str){ ary.push(alltag[i]); } } return ary; } window.$ = function(str){ var ID = str.match(/^#(\w+)/), CLASS = str.match(/^\.(\w+)/), TAG = str.match(/^(\w+)|(\*)/), node = str.match(/^doc/)? document: TAG? document.getElementsByTagName(RegExp.$1==""?RegExp.$2:RegExp.$1): ID? document.getElementById(RegExp.$1): CLASS? navigator.appVersion.toLowerCase().indexOf("msie")? className(str): document.getElementsByClassName(RegExp.$1): null; this.style = function(css){ css = css.split(/\:|\;/); if(ID){ for(var j=0;j<css.length;j++) node.style[css[j].replace(/\s+/g,"").replace(/\-(\w)/,function($1){$1=$1.substr(1);return $1.toUpperCase()})] = css[j+1]; }else{ for(var i=0;i<node.length;i++){ for(var j=0;j<css.length;j++) node[i].style[css[j].replace(/\s+/g,"").replace(/\-(\w)/,function($1){$1=$1.substr(1);return $1.toUpperCase()})] = css[j+1]; } } } return this; } window.onload = function(){ var st = new Date().getTime(); for(var i=0;i<10000;i++){ $('#wrap').style("color:#00f; background:#f00; border-left:10px solid #000;"); $('div').style("border-right:10px solid #000; width:100px; height:100px; margin:10px;"); $('.cl').style("border-top:10px solid #000; background:#00f;"); } var end = new Date().getTime(); alert(end-st); } //]]> </script> <title></title> </head> <body> <div id="wrap">aaaaa</div> <div class="cl">bbb</div> <div class="cl">ccc</div> </body> </html> 他にも、もっとこうしたほうが…等ありましたら教えてください。どうか宜しくお願いします。

  • localStorageでのcheckbox制御

    下記サイトを参考に、テキストボックスとチェックボックスをlocalStorageに保存するプログラムを作ってみました。 http://jsdo.it/twi_masa/hx8D 質問ですが、チェックやテキストを書いて保存ボタンを押すとlocalStorageに値が保存されることはchromeのデベロッパーツールで確認しました。 値がある状態でロードを押すとその保存された状態に復元されますが、それをロードボタンを押さずにページが読み込まれた直後に表示させる方法が知りたいです。 window.onload = function(){ 処理 } だと思い、 load : functionをwindow.onload = functionへ単純に変更しましたが、それでは保存もロード出来なくなってしまいました。 自分では全く書けないので、出来ましたらソースを書いていただけるとありがたいです。 よろしくお願いします。 <table> <tr> <td>テキスト</td> <td><input type="text" id="text1" /></td> </tr> <tr> <td>チェックボックス</td> <td> <input type="checkbox" id="checkbox1" value="0">チェック1 <input type="checkbox" id="checkbox2" value="0">チェック2 </td> </tr> </table> <input type="button" value="保存" onclick="hx8D.save();"> <input type="button" value="ロード" onclick="hx8D.load();" /> <script> var hx8D = function(){ var HX8D = function(){}; HX8D.prototype = { save : function(){ var elements = document.getElementsByTagName("input"); for(var i=0; i<elements.length; i++){ var type = elements[i].type; var key = elements[i].id; if(type == "text"){ localStorage[key] = elements[i].value; }else if(type == "checkbox"){ localStorage[key] = elements[i].checked; } } }, load : function(){ var elements = document.getElementsByTagName("input"); for(var i=0; i<elements.length; i++){ var type = elements[i].type; var key = elements[i].id; if(type == "text"){ elements[i].value = localStorage[key]; }else if(type == "checkbox"){ elements[i].checked = localStorage[key] == "true" ? true : false; } } }, }; return new HX8D(); }(); </script>

  • attachEvent(addEventListener)の使い方

    --- HTML部 --- <form name="f"> <input type="text" name="i1" /> <input type="text" name="i2" /> <input type="text" name="i3" /> </form> --- JavaScript部 --- function doFocus (node) { alert(node.name); } function addFocus () { for (var i = 0; i < arguments.length; i++) { var Arg = eval("document.f." + arguments[i]); Arg.attachEvent("onfocus", function(){doFocus(this);}); } } addFocus("i1","i2","i3") 上記スクリプトを実行したときこちらの期待する結果は テキストフィールドにフォーカスがあたると それぞれのname属性値が表示されることなのですが 現状では何も表示の無いアラートが帰ってきます。 また「this」と指定している箇所を「Arg」と変更してみたのですが この場合はどのテキストフィールドにフォーカスがあたっても 「i3」と返ってきてしまいました。 addFocusの引数をひとつにし、「this」と記述している箇所を 「Arg」とすればうまくいくことは確認しているのですが できれば上記のようにaddFocusに複数の引数を渡して対応したいと 考えております。 通常はINPUTタグのonfocusイベントハンドラに 「dofocus(this);」と書けば済む話ではあるのですが attachEventを利用した場合の記述がうまくできなかったので 質問させていただきました。 前置きが長くなりましたが、addFocusの仕様(引数)を変更せずに 期待する結果を得るにはどのようにすればよいでしょうか?

  • [020-150]を020jpg 021jpg・・・と展開したい。

    http://www.okweb.ne.jp/oshiete_new.php3 の質問のつづきです。 http://www.aaa.com/xxx[020-150].jpg を http://www.aaa.com/xxx020.jpg http://www.aaa.com/xxx021.jpg 以下このようなものが、 http://www.aaa.com/xxx150.jpgになるまで 一覧表示される。 このようなスクリプトを教えてください。  forを用いてループさせるのは分かるのですが どのように頭に”0”をつけて桁あわせすればよいかわからなくて。 http://www.okweb.ne.jp/oshiete_new.php3 を見ながら自分なりに考えているのですが、 [020-150]の020部分の桁数をしらべて。 その桁数-Iの桁数=頭につける0の数・・・・ Iは forの中のループに使用される数で・・・ えーっと、すいません、混乱してます。  ちなにみ桁をあわせない場合は次のようになります。 zzzzzzさん、大変お世話になりました。 正規表現の便利さを実感しました。 ************************************* <HTML> <HEAD> <TITLE>URLを展開</TITLE> <SCRIPT LANGUAGE="JavaScript"> <!-- Hide script from old browser function my1(str) { if (str.match(/^(.*)\[(\d+)\-(\d+)\](.*)$/) != null) { var win = window.open(); for (var i=Number(RegExp.$2); i<=Number(RegExp.$3); i++) { win.document.write(RegExp.$1 + i + RegExp.$4 + "<BR>\n"); } } else { alert("式が展開可能ではありません。"); } } // end Hiding --> </SCRIPT> </HEAD> <BODY BGCOLOR="#D0D0D0"> <FORM NAME="form1"> <input type="text" name="text1"value="" size="60"> <input type="button" value="クリック" onClick="my1(document.forms['form1'].text1.value) "> </FORM> </BODY> </HTML> *************************************

  • 引数の文字列を全て連結する関数について

    var config={ connect:{character:',',expand:true,operator:':'} /* character……何の文字列で連結するか expand……展開するかどうか(true/false or number) 数字の場合は、展開する回数 operator……オブジェクト( {a:'a',b:'b'}など )の場合、キーと値を連結する文字列(key+operator+value) */ }; function connect(){ var connectString=config.connect.character,expand=config.connect.expand,operator=config.connect.operator,n=0; var subCallee=function(arg){ var text=arg,i; if(typeof arg=='object'){ var number=arg.length; switch(expand){ case true: text=subCallee(arg[0]); foreach(arg,function(i,key,value){ //i……ループ回数-1 key……Object:キー,Array:i value……値 if(i){ //0回目はすでに再帰呼び出し済み text+=connectString+subCallee(value); //再帰呼び出しで、展開 } }); break; case false: case 0: //展開回数0(0)もしくは、展開しない(false)場合 text=arg[0]; foreach(arg,function(s){ if(s){ text+=connectString+this; //展開しないので、そのまま引数をつなげる。 } }); break; default: if(typeof expand=='number'){ //expandがNumber型だった時 if(n>expand){ //nは最初に定義済み。展開回数が、指定された回数を越えた場合には、終了。 break; } foreach(arg,function(i,key,value){ i(i){ text+=connectString+subCallee(value); } }); n++; //何回展開したか、数える。 break; } return false; } } return text; }; return subCallee(arguments); //最初にargumentsを渡して、subCalleeを呼ぶ。 } このように定義されていますが、Array型とObject型はtypeofしても、共にobjectが帰ってくるため、判別できません。 何か判別する方法はないでしょうか? また、Object型の場合には、valueをkey+config.connect.operator+value(つまり、key:valueのような感じ)にしたいのですが、 text+=character+key+operator+subCallee(value); とし、 var a=config.connect; a.character='<>'; alert(connect({a:0,b:1})); としましたが、alert表示されたのは、 undefined<>b:1 でした; Object,Arrayの判定はしてないので、Arrayを入れてみたら↓ alert(connect(['a','b',['c',['d']]])); ↓ a<>1:b<>2:c<>1:d となっています。 展開順に考えて、以下のようになるのが妥当かな、と思ったのですが; まず、['a','b',[]] なので、 0:a<>1:b<>[] で、次に[]の中の、['c',[]]が展開されるので、 <>2:c<>[] 最後に、['d']が展開されるので、 <>1:d よって、 0:a<>1:b<>2:c<>1:d かな、と。。 実際はa<>b<>c<>dでいいので、ここは気にしなくていいですw Object,Arrayの判定方法と、Objectの場合、key:valueを取得する方法を、宜しくお願いします。

  • dreamweaverについて

    JavaやCSSがサーバーにUPロードしても反映しないのです。 dreamweaverのブラウザーの表示では、確かに確認できるのですが、 CSSのリンクかJavaの宣言に以下のコメントがひっているのですが、これが原因でようか? <link href="file:///F|/ais2008test/mystyle.css" rel="stylesheet" type="text/css" /> <script type="text/javascript"> <!-- function MM_preloadImages() { //v3.0 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} } function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc; } function MM_findObj(n, d) { //v4.01 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); if(!x && d.getElementById) x=d.getElementById(n); return x; } function MM_swapImage() { //v3.0 var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];} } //--> </script> 誰か教えてください!

  • JavaScript文字列連携に関して

    質問させて頂きます。 下記のようなテキストフォームがあったとして、submit押された時に、jsを走らせ、テキストに数値以外が入っていないかチェックしたいと考えています。 ------------------------------------------------- <input type="text" name="text_1" /> <input type="text" name="text_2" /> <input type="text" name="text_3" /> ------------------------------------------------- チェック自体は下記のような記述で行うことが出来ました。 ------------------------------------------------- if(document.form1.text_1.value.match(/[^0-9]+/)){ //文字です } if(document.form1.text_2.value.match(/[^0-9]+/)){ //文字です } if(document.form1.text_3.value.match(/[^0-9]+/)){ //文字です } ------------------------------------------------- ですが、同じif文を並べて記述したくなかったので、for文を使って記述したいと考えました。 ------------------------------------------------- for (var i=1 ; i<=3 ; i++){ if(document.form1.text_1.value.match(/[^0-9]+/)){ //文字です } } ------------------------------------------------- この時、if文内のtext_1をどのように記述すれば、text_1,text_2,text_3と変化させることが出来るでしょうか。 ※「text_ + i +」等試してみましたが、正常に動作出来ませんでした。 ご存知の方がいらっしゃいましたら、ご教授頂けると助かります。 また、質問の内容に不備な点があるかもしませんが、その際はご指摘頂けると幸いです。 よろしくお願いいたします。

  • 半角英数字の判別

    お世話になります テキストフィールドにおいて半角英数字のチェックをしたいのですが・・・ 例えば『012ab』のような場合、 <script Language="JavaScript"> <!-- function checkText() { txt = document.myFORM.moto.value; if (txt.match(/[^a-z|^A-Z]/g)) alert("アルファベット以外が含まれてます"); } //--> </script> <form name="myFORM"> <input type="text" name="moto"> <input type="button" value="調べる" onClick="checkText()"> </form> では数字が入力されてるとalertされます function checkNum() { txt = document.myFORM.moto.value; for (i=0; i<txt.length; i++) { c = txt.charAt(i); if ("0123456789".indexOf(c,0) < 0) { alert("数値以外が含まれてます"); return; } } } //--> </script> <form name="myFORM"> <input type="text" name="moto"> <input type="button" value="調べる" onClick="checkNum()"> </form> ではアルファベットがあるとalertされてしまいます この2つをどのように組み合わせれば半角英数字以外であればalertされるようになるのでしょうか?

  • 2つのjavascriptの命令を1ページでやるには。

    Javascriptの超初心者です。 現在サイトを作っておりまして、 あるページに2つのjavascriptの命令を書き込みたいのですが。。。 1つはjavascriptによるプルダウンメニューをグローバルメニューの中に使用しています。 そしてもう1つはそのページ内にスワッピングで小さいサムネイル画像をクリックすると、大きな写真が切り替わるという仕掛けをjavascriptを使用して(dreamweaverの生成したものですが^^;)作ったのですが、 単体ではもちろん動作するのですが、2つ同時に自分なりにまとめてみてもどうにも動作しません。。2つを一緒にまとめるにはどのようなソースを書けばよいのでしょうか? どなたかご教授頂けませんでしょうか?宜しくお願い致します。 以下ソースです。 ●プルダウン用 (外部の長いjavascriptを読み込んでます) <link href="css/import.css" rel="stylesheet" type="text/css" media="all" /> <script src="js/SpryMenuBar.js" type="text/javascript"></script> <script type="text/javascript"><!-- window.onload = function(){ new Spry.Widget.MenuBar("MenuBar1"); } // --></script> ●スワッピング画像用 (直接書き込んでいます) <link href="css/import.css" rel="stylesheet" type="text/css" media="all" /> <script type="text/JavaScript"> <!-- function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc; } function MM_preloadImages() { //v3.0 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} } function MM_findObj(n, d) { //v4.01 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); if(!x && d.getElementById) x=d.getElementById(n); return x; } function MM_swapImage() { //v3.0 var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];} } //--> </script> 以上の2つはどのようにまとめたら両方動作するのでしょうか?

  • JavaScriptのエラー で困っています

    JavaScriptのエラー SyntaxError: missing ] after element list PDFをWEBで閲覧→ダウンロードしても閲覧不可 の設定をするために、 PDF上で下記のJavaScriptを書きこみました。 元ネタは http://kaathemachine.com/javascript/2010/02/19/pdf%E3%82%92%E4%BF%9... こちらからいただいて、 途中の手順までは終了したのですが、 下記JavaScriptをページのプロパティのアクションから入れようとすると、 SyntaxError: missing ] after element list のエラーが出て保存ができません。 var arr = ["Text1","Text2","Text3","Text4","Text5","Text6","Text7","Text8","Text9","Text10","Text11","Text12","Text13,"Text14","Text15","Text16","Text17","Text18","Text19","Text20","Text21","Text22","Text23","Text24","Text25","Text26","Text27"]; if(this.URL.indexOf("掲載したいPDFのURL")==0){ for(var i=0;i<arr.length;i++) { this.getField(arr[i]).hidden = true; } エラーとしてハイライトされるのは if(this.URL.indexOf("掲載したいPDFのURL")==0){ } else{ app.alert("保存しての閲覧は許可されていません。") } の部分です。 "掲載したいPDFのURL"の部分にはもちろん http://で始まり.pdfで終わるURLを入力しています。 JavaScriptは初心者で、 なぜこのようなエラーが出るのか、 どう対処すればいいのかが全く分かりません。 お分かりになる方いらしたら、ご教授ください。

専門家に質問してみよう