3

PHPでJavaScriptスクリプトを翻訳しようとしています。これまでのところ順調に進んでいますが、私が無知なコ​​ードに出くわしました。

while (match = someRegex.exec(text)) {
    m = match[0];

    if (m === "-") {

       var lastIndex = someRegex.lastIndex,
           nextToken = someRegex.exec(parts.content);

       if (nextToken) {
              ...
       }

       someRegex.lastIndex = lastIndex;
    }
}

変数は次のsomeRegexようになります。

/[^\\-]+|-|\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)/g

execは、PHPのpreg_match_allと同等である必要があります。

preg_match_all($someRegex, $text, $match);
$match = $match[0];  // I get the same results so it works

foreach($match as $m){

   if($m === '-'){

     // here I don't know how to handle lastIndex and the 2nd exec :(

   }

}
4

2 に答える 2

3

私はそのlastIndex魔法をまったく使用しません-基本的に、各インデックスで正規表現を2回実行しています。本当にそれをしたいのなら、あなたは位置を取得し、キャプチャの長さを追加し、それを次のオフセットとして使用できるようにPREG_OFFSET_CAPTUREフラグを設定する必要があります。preg_match_allpreg_match

次のようなものを使用することをお勧めします。

preg_match_all($someRegex, $text, $match);
$match = $match[0]; // get all matches (no groups)

$len = count($match);
foreach($match as $i=>$m){

    if ($m === '-') {
        if ($i+1 < $len) {
            $nextToken = $match[$i+1];
            …
        }
        …
    }
    …
}
于 2013-03-26T15:43:56.633 に答える
1

実際には、execはpreg_match_allと同等ではありません。これは、execが最初の一致で停止するためです(g修飾子は、文字列をループするようにlastIndex値のみを設定します)。preg_matchと同等です。したがって、最初の一致を見つけ、$ array引数、この値のオフセット($ flagsに含まれる)のおかげで値を取得し、オフセット(最後の引数)を設定して検索を続行します。

javascriptバージョンとまったく同じことを行うので、2回目の実行は問題にならないでしょう。

ループを試したことがないことに注意してください。ただし、preg_matchがオプションの引数と正確にどのように機能するかを理解したら、かなり簡単なはずです(テストを実行します)。

$lastIndex = 0;
while(preg_match($someRegex, $text, $match, PREG_OFFSET_CAPTURE, $lastIndex) {
  $m = $match[0][0];
  $lastIndex = $match[0][1] + strlen($m); //thanks Bergi for the correction

  if($m === '-') {
            // assuming the $otherText relate to the parts.content thing
    if(preg_match($someRegex, $otherText, $secondMatch, 0, $lastIndex)) {
      $nextToken = $secondMatch[0];
      ...
    }
  }
}

私はそれがそれであるはずだと思います(小さなエラーを許してください、しばらくの間phpをしていません)。

于 2013-03-26T15:16:19.193 に答える