2

次の形式からデータを取得する php で正規表現を作成しようとしています。

"1,2,3;7,1,3;1" returns an $matches array with "(1,2,3,7,1,3,1)"

"1" returns an $matches with "(1)"

"1;1;3;5;7;10;999" returns an $matches array with "(1,1,3,5,7,10,999)"

"1,1,1;2,5;3,4" doesn't pass since numbers are repeating within semicolon boundaries

"2,3,4;5,;" doesn't pass since it doesn't satisfy the format.

(例の引用符は、読みやすくするためにあります。実際の結果には表示されません。)

形式は、コンマまたはセミコロンで区切られた数字であり、セミコロン内では互いに繰り返されません。他の形式を受け入れてはなりません。

試してみ/(^(\d{1,3})$)|(([0-9]+)([,|;]{1}[0-9]+)+)/ましたが、うまくいきませんでした。私も試し/[0-9]+([,|;]{1}[0-9]+)+/ましたが、どちらもうまくいきませんでした。$matches 配列を取得したとき、上記のように必要な値がありませんでした。

私はPHP 5.2でこれをやっています。ありがとう。

4

2 に答える 2

2

この特定の問題は、正規表現が実用的であるにはロジックが多すぎます。これは、通常のコードで解決する方法です。

// reduction function - keeps merging comma separated arguments
// until there's a duplicate or invalid item
function join_unique(&$result, $item)
{
    if ($result === false) {
        return false;
    }

    $items = explode(',', $item);
    $numbers = array_filter($items, 'is_numeric');

    if (count($items) != count($numbers)) {
        return false;
    }

    $unique = array_unique($numbers);

    if (count($unique) != count($numbers)) {
        return false;
    }

    return array_merge($result, $numbers);
}

// main function - parse a string of comma / semi-colon separated values
function parse_nrs($str)
{
    return array_reduce(explode(';', $str), 'join_unique', array());
}

var_dump(parse_nrs('1,2,3;7,1,3;1'));
var_dump(parse_nrs('1'));
var_dump(parse_nrs('1;1;3;5;7;10;999'));
var_dump(parse_nrs('1,1,1;2,5;3,4'));
var_dump(parse_nrs('2,3,4;5,;'));

出力:

array(7) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
  [3]=>
  string(1) "7"
  [4]=>
  string(1) "1"
  [5]=>
  string(1) "3"
  [6]=>
  string(1) "1"
}
array(1) {
  [0]=>
  string(1) "1"
}
array(7) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "1"
  [2]=>
  string(1) "3"
  [3]=>
  string(1) "5"
  [4]=>
  string(1) "7"
  [5]=>
  string(2) "10"
  [6]=>
  string(3) "999"
}
bool(false)
bool(false)

以下も参照してください。array_reduce() array_unique()

于 2013-04-24T16:59:46.177 に答える
1

ワンステップでこれを行うことは不可能です。最初に、セミコロンの境界内で繰り返される数字の要件を確認する必要があります。次に、合格した場合は、文字列を分割します。

例えば:

if (!preg_match('/\b(\d+),[^;]*\b\1\b/', $string)) {
    $matches = preg_split('/[,;]/', $string);
} else {
    $matches = NULL;
}

イデオネ: http://ideone.com/Y8xf1N

于 2013-04-24T16:56:51.153 に答える