1

次のような形式の文字列があります。

5;1-x;1-2;(1-x;)+

1 から無限大までのすべての整数の表記として 1-x を使用し、最後の整数を何度でも繰り返すことができることを示すために (1-x;)+ を使用しました。

文字列の例:

5;1;1;1
5;7;2;7;5;1;9

これらの文字列を正規表現と一致させ、すべての (1-x;)+ 一致を取得するにはどうすればよいですか?

私は次のことを試しました:

preg_match_all('%5;([1-9]{1}[0-9]*);([1-2]);([1-9]{1}[0-9]*;?)+%',
               $str, $matches);

文字列 "5;1;1;1" の結果は次のとおりです。

array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(7) "5;1;1;1"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  [2]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  [3]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
}

文字列 "5;7;2;7;5;1;9" の場合:

array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(13) "5;7;2;7;5;1;9"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "7"
  }
  [2]=>
  array(1) {
    [0]=>
    string(1) "2"
  }
  [3]=>
  array(1) {
    [0]=>
    string(1) "9"
  }
}

ご覧のとおり、(1-x;)+ の最後の整数のみが match 配列に含まれていますが、matches 配列には最後の値だけでなく、値 7、5、1、および 9 を含めたいと考えています。これは正規表現を使用しても可能ですか、またはこれらの文字列から値を検証して取得するために別のアプローチを使用する必要がありますか?

4

2 に答える 2

2

一方通行

//$str = "5;1;1;1";
$str = "5;7;2;7;5;1;9";
$pattern = '%^5;([1-9]\d*;)[12];((?:[1-9]\d*;?)+)$%';

$str = preg_replace( $pattern, '$1$2', $str, -1, $count );

if ( $count ) {
   print_r( explode( ';', $str ) );
} else {
   echo 'Invalid string';
}

-1つまり、交換回数に制限はありません。
$count交換した回数です。文字列が1有効であるか、0そうでないかです。

上記は、文字列が;.

于 2013-02-21T17:52:46.887 に答える
0

I honestly would just explode the string and remove the unwanted first and third elements that like this:

$array = explode(';', $string);
$diff_array = array(0 => 'not_used', 2 => 'not_used');
$final_array = array_key_diff($array, $diff_array);

This gives you an array of all the values except the first and third elements which are the ones which you seem to not be interested in.

If you then need to verify that the remaining elements are indeed integers with value >= 1 you could run an array_filter on it like this:

$filtered_array = array_filter($final_array, function($value) {
    if ((string)(int)$value == $value && (int)$value >= 1) return true;
    return false;
}
于 2013-02-21T17:04:45.290 に答える