0

これは単純な問題ですが、私は自分でそれを理解しようとしてあまりにも多くの時間を無駄にしています。

r{N}-{N}s{N}{N}が1桁または2桁の数字であるパターンの文字列にデータを保存しました。このパターンは最大5回繰り返すことができます。パターンから数字を抽出する必要があります。できれば何らかの方法でグループ化します。

たとえば、文字列がだった場合、"r4-10s5"抽出したい{4,10,5}

文字列が"r4-10s5r6-7s8"抽出したい場合{4,10,5} {6,7,8}

PHPでこれを行うにはどうすればよいですか?

再帰的な正規表現を使用しようとしましたが、正しく一致させることができません。

4

3 に答える 3

1
$str = "r4-10s5r6-7s8";

preg_match_all("#r(\d{1,2})-(\d{1,2})s(\d{1,2})#", $str, $matches);

// group the matches together
$sets = array();
for ($i = 0, $count = count($matches[0]); $i < $count; $i++)
    $sets[] = array($matches[1][$i], $matches[2][$i], $matches[3][$i]);

print_r($sets);

出力:

array (size=2)
  0 => 
    array (size=3)
      0 => string '4' (length=1)
      1 => string '10' (length=2)
      2 => string '5' (length=1)
  1 => 
    array (size=3)
      0 => string '6' (length=1)
      1 => string '7' (length=1)
      2 => string '8' (length=1)

ループを持たない別のオプションは次のとおりです。

preg_match_all("#r(\d{1,2})-(\d{1,2})s(\d{1,2})#", $str, $matches, PREG_SET_ORDER);

print_r($matches);

出力:

array (size=2)
  0 => 
    array (size=4)
      0 => string 'r4-10s5' (length=7)
      1 => string '4' (length=1)
      2 => string '10' (length=2)
      3 => string '5' (length=1)
  1 => 
    array (size=4)
      0 => string 'r6-7s8' (length=6)
      1 => string '6' (length=1)
      2 => string '7' (length=1)
      3 => string '8' (length=1)
于 2013-02-05T23:29:16.213 に答える
1

静的パターンは次のとおりです: r - sで、空のスポットは数字のみにすることができます

/r(\d{1,2})-(\d{1,2})s(\d{1,2})/=> ここでテスト: http://regex101.com/r/sH4sY0

\d{1,2}連続する 1 桁または 2 桁の数字に一致

于 2013-02-05T23:24:34.417 に答える
-1

これは私がそれを行う方法です:

function extractNumbers($string, $multiples = 3, $strict = false) {
    $string = preg_replace('/\D+/', ' ', trim($string));
    $array  = explode(' ', trim($string));
    $count  = count($array);
    $remove = ($count % $multiples);
    if ($remove > 0) {
        // Strict, do not allow dangling numbers
        if ($strict) {
            return null;
        }
        $array = array_slice($array, 0, ($count - $remove));
    }
    $array = array_map('intval', $array);
    return array_chunk($array, $multiples);
}
$str = 'r4-10s5r6-7s8';
var_dump(extractNumbers($str));

あまり洗練されていないかもしれませんが、理解と維持は比較的簡単です。

于 2013-02-06T00:01:35.667 に答える