PHPのpreg_match_allをJavaScriptで

謎のプリン語る。
プログラミングの役立つ情報とか、どうでもいい雑談とか書いてます。
一人書く人増えました。

PHPのpreg_match_allをJavaScriptで

みやびプリン 500 316

144 144

※この記事は8年以上前の記事です。
現在は状況が異なる可能性がありますのでご注意ください。

こんばんみ。
AM1時40分。
眠い。

さてさてPHPには死ぬほど便利な関数がある。
表記にもある、
"preg_match_all"だ!
詳しくは下記リファレンスをご参照のこと。

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 関数のようにキャプチャの結果が格納された配列を得たい

さて、寝よう。。。。

トラックバック(0)

トラックバックURL:

コメントする

ページトップへ戻る