2

多くのデータのペアを含む単一の文字列を処理しています。; 各ペアは記号で区切られています。各ペアには、符号で区切られた数値と文字列が含まれます=

処理は簡単だと思っていましたが、ペアの半分の文字列に= and;記号が含まれている可能性があり、単純な分割が信頼できないものになっていることがわかりました。

問題のある文字列の例を次に示します。

123=one; two;45=three=four;6=five;

これを正しく処理するには、次のような配列に分割する必要があります。

'123', 'one; two'
'45',  'three=four'
'6',   'five'

私は少し行き止まりにいるので、どんな助けも大歓迎です。

アップデート:

助けてくれたみんなに感謝します。これが私がこれまでのところです:

$input = '123=east; 456=west';

// split matches into array
preg_match_all('~(\d+)=(.*?);(?=\s*(?:\d|$))~', $input, $matches);

$newArray = array();

// extract the relevant data
for ($i = 0; $i < count($matches[2]); $i++) {
    $type   = $matches[2][$i];
    $price  = $matches[1][$i];

    // add each key-value pair to the new array
    $newArray[$i] = array(
        'type'      => "$type",
        'price'     => "$price"
    );
}

どの出力

Array
(
    [0] => Array
        (
            [type] => east
            [price] => 123
        )

)

末尾にセミコロンがないため、2 番目の項目がありません。修正方法がわかりません。

ペアの数値部分に小数点が含まれることがあり、最後の文字列ペアの後にセミコロンがないことに気付きました。運があまりないので、ヒントをいただければ幸いです。

これは、最初の質問で見逃していたことを考慮して更新された文字列です (申し訳ありません)。

12.30=one; two;45=three=four;600.00=five
4

5 に答える 5

1

これには先読みアサーションが必要です。;aの後に数字または文字列の末尾が続く場合、先読みは一致します。

$s = '12.30=one; two;45=three=four;600.00=five';

preg_match_all('/(\d+(?:.\d+)?)=(.+?)(?=(;\d|$))/', $s, $matches);

print_r(array_combine($matches[1], $matches[2]));

出力:

Array
(
    [12.30] => one; two
    [45] => three=four
    [600.00] => five
)
于 2013-04-19T08:55:37.520 に答える
1

次のpreg_match_allコードを使用して、それをキャプチャできます。

$str = '123=one; two;45=three=four;6=five;';
if (preg_match_all('~(\d+)=(.+?);(?=\d|$)~', $str, $arr))
   print_r($arr);

ライブデモ: http://ideone.com/MG3BaO

于 2013-04-19T05:49:01.263 に答える
0

これを試してみてください。ただし、このコードは C# で記述されています。php に変更できます。

 string[] res = Regex.Split("123=one; two;45=three=four;6=five;", @";(?=\d)");

--SJ

于 2013-04-19T05:43:15.110 に答える