PHPのpreg_match_allをJavaScriptで再現

Pocket

PHPにはpreg_match_allという関数があります。正規表現を使い、マッチする文字列を全て取得できます。括弧を使うとその部分も取得できます。テキストファイルやHTMLファイルからパターンに沿った文字列を簡単に取得できるのでとても便利です。

一方、JavaScriptにはmatchというメソッドがあります。gフラグを指定するとマッチする文字列を全て取得することができます。ただし括弧を使ってその部分を取得するということはできません。
そこで、preg_match_allを再現する方法を考えました。

PHPのpreg_match_allは「preg_match_all($pattern, $subject, $matches, $flags)」のように使います。
$patternは"/正規表現/フラグ"のように指定します。
$subjectは対象となる文字列です。
$matchesにマッチした文字列が配列として格納されます。
$flagsはマッチさせる順番です。詳細は後述します。
下はこれをJavaScriptで再現したものです。

preg_match_all

function preg_match_all(pattern, subject, flags) {
  var recs, re, lines, parts, i, j, lines_length, parts_length;
  recs = [];
  re = new RegExp(pattern, "gm");
  lines = subject.match(re);
  re = new RegExp(pattern, "");
  lines_length = lines.length;
  for (i = 0; i < lines_length; i++) {
    parts = lines[i].match(re);
    parts_length = parts.length;
    if (flags === "PREG_PATTERN_ORDER" || flags === "") {
      for (j = 0; j < parts_length; j++) {
        if (typeof (recs[j]) === "undefined") {
          recs[j] = [];
        }
        recs[j][i] = parts[j];
      }
    } else if (flags === "PREG_SET_ORDER") {
      recs[i] = [];
      for (j = 0; j < parts_length; j++) {
        recs[i][j] = parts[j];
      }
    }
  }
  return recs;
}

patternは正規表現を指定します。フラグは指定しません(できません)。「\」を使うときは「\\」のように二重にします。
subjectは対象となる文字列です。
flagsは「PREG_PATTERN_ORDER」(デフォルト)または「PREG_SET_ORDER」を指定します。詳細は下の実行結果を参照ください。
PHPでは$matchesのように配列変数を指定しこれに格納されますが、こちらは戻り値が配列になります。

サンプル

var subject, pattern, flags, recs;
subject = "a:123\nb:456\nc:789\nd:012";
pattern = "([a-z]):([0-9]+)";
flags = "PREG_PATTERN_ORDER";//または"PREG_SET_ORDER"
recs = preg_match_all(pattern, subject, flags);

実行結果

戻り値は2次元の配列になります。flagsの指定で格納の順番が変わります。

PREG_PATTERN_ORDER

"a:123\nb:456\nc:789\nd:012"に対して正規表現"([a-z]):([0-9]+)"で実行し、戻り値はrecsとします。
recs[0]には"([a-z]):([0-9]+)"にマッチする全ての文字列が配列で返ります。
recs[1]には1番目の括弧"([a-z])"にマッチする全ての文字列が配列で返ります。
recs[2]には2番目の括弧"([0-9]+)"にマッチする全ての文字列が配列で返ります。

'0' ...
    '0' => "a:123"
    '1' => "b:456"
    '2' => "c:789"
    '3' => "d:012"
'1' ...
    '0' => "a"
    '1' => "b"
    '2' => "c"
    '3' => "d"
'2' ...
    '0' => "123"
    '1' => "456"
    '2' => "789"
    '3' => "012"

PREG_SET_ORDER

"a:123\nb:456\nc:789\nd:012"に対して正規表現"([a-z]):([0-9]+)"で実行し、戻り値はrecsとします。
recs[0]には"([a-z]):([0-9]+)"にマッチする最初の文字列が返ります。recs[0][0]に文字列全体、recs[0][1]に1番目の括弧"([a-z])"、recs[0][2]に2番目の括弧"([0-9]+)"にマッチする文字列が配列で返ります。
recs[1]には2番目にマッチする文字列、部分が配列で返ります。

'0' ...
    '0' => "a:123"
    '1' => "a"
    '2' => "123"
'1' ...
    '0' => "b:456"
    '1' => "b"
    '2' => "456"
'2' ...
    '0' => "c:789"
    '1' => "c"
    '2' => "789"
'3' ...
    '0' => "d:012"
    '1' => "d"
    '2' => "012"

[ 2014年2月4日 | カテゴリー: JavaScript | タグ: , , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報