※この記事は8年以上前の記事です。
現在は状況が異なる可能性がありますのでご注意ください。
こんばんみ。
AM1時40分。
眠い。
さてさてPHPには死ぬほど便利な関数がある。
表記にもある、
"preg_match_all"だ!
詳しくは下記リファレンスをご参照のこと。
この関数を使えば、
正規表現を使って文字列の繰り返し検索ってのができる。
要は、文字列の中にある、<tag>文字列だお</tag>のような感じの
タグっぽいものの間の文字をとってこれたりする。
$str = '文字列だお 、やっほーあほだお'; preg_match_all("|<[^>]+>(.*)</[^>]+>|U", $str, $out, PREG_SET_ORDER); echo $out[0][0] . ", " . $out[0][1] . "\n"; echo $out[1][0] . ", " . $out[1][1] . "\n"; /* 出力結果文字列だお , 文字列だおあほだお, あほだお */
なんて便利なんだ!!!!!!
これをJavaScriptでやれないか、なんて思い調べたら、案の定なかったので、
作ってみた。
//every関数を使ってるので、対応してないブラウザのためになかったら定義 if(!Array.prototype.every){ Array.prototype.every = function(callBack){ var parent = this; var lastReturnBool = true; for(var i=0; i < parent.length; i++){ lastReturnBool=callBack(parent[i],i,parent); if(lastReturnBool){ continue; } else { break; } } return lastReturnBool; }; } //文字列クラスの拡張 //PHPのpreg_match_all関数のような関数 //PHPの定数っぽいの定義 var PREG_PATTERN_ORDER = 'prefPatternOrder', PREG_SET_ORDER = 'pregSetOrder', PREG_OFFSET_CAPTURE = 'pregOffsetCapture'; String.prototype.pregMatchAll = function(patternStr, flgs, offset){ var parent = this; var parentStr = ''; var usedOffset = 0; if (offset) { usedOffset = offset; } for (var i = usedOffset; i < parent.length; i++) { parentStr += parent[i]; } var resSingle = true; var resObjInner01 = new Array(0); var resObjInner02 = new Array(0); var resObj = new Array(resObjInner01, resObjInner02); if (patternStr !== '') { var returnNo = 0; while(resSingle){ resSingle = patternStr.exec(parentStr); if (resSingle) { switch(flgs){ case PREG_PATTERN_ORDER: resObj[0].push(resSingle[0]); resObj[1].push(resSingle[1]); break; case PREG_SET_ORDER: if (returnNo === 0) { resObj = new Array(0); } var innerArray = new Array(resSingle[0], resSingle[1]); resObj.push(innerArray); break; case PREG_OFFSET_CAPTURE: var innerOnPattern = new Array(resSingle[0], resSingle.index); var noPatternIndex = resSingle.index + resSingle[0].indexOf(resSingle[1]); var innerNoPattern = new Array(resSingle[1], noPatternIndex); resObj[0].push(innerOnPattern); resObj[1].push(innerNoPattern); break; default: resObj[0].push(resSingle[0]); resObj[1].push(resSingle[1]); break; } returnNo++; } } if (resObj.length === 0) { resObj = 0; } else { var evFlg = resObj.every(function(val, index){ if (val.length === 0) { return false; } else { return true; } }); if (!evFlg) { resObj = 0; } } } else { resObj = false; } return resObj; };
使い方は下記
var strff = '文字列だお 、やっほーあほだお'; //正規表現オブジェクトを生成 var reg = new RegExp("<[^>]+>(.*)</[^>]+>", "g"); var searchStrArr = strff.pregMatchAll(reg, PREG_PATTERN_ORDER);
これでPHPの方とだいたい同じ動きをするはず。
これ使ってこう、マジ便利。
ちなみに、下記エントリーを参考にさせていただきました。
whileの部分とか
●[Javascript] PHP の preg_match_all 関数のようにキャプチャの結果が格納された配列を得たい
さて、寝よう。。。。
コメントする