こんばんみ。
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 関数のようにキャプチャの結果が格納された配列を得たい
さて、寝よう。。。。
コメントする