0

私はこれに頭を悩ませてきましたが、次のことを達成するための正規表現を理解できません:

入力文字列 (これは、他の多くの JSON に囲まれた JSON データです):

$string=..."natural_order":"12"...

ここで、12 は「1.2」のような小数の場合もあれば、1288 や 1.288 のように大きい場合もあります。

希望の文字列:

..."natural_order":12...

php preg_replace を使用して、これまでのところ次のようになりました。

preg_replace('/[^natural_order:]+"/', '', $string);

ただし、次のみを返します。

"12"

どんな考えでも大歓迎です!

4

2 に答える 2

2

トリッキーな正規表現の代わりに、次の行に沿って何かを提案します。

$array = json_decode($string, true);
array_walk_recursive($array, function (&$value, $key) {
    if ($key == 'natural_order') {
        $value = strpos($value, '.') ? (float)$value : (int)$value;
    }
});
$string = json_encode($array);
于 2011-08-11T03:58:31.207 に答える
0

私は2つの解決策を考えることができます。1 つ目は、あえて書きませんが、 を使用して JSON をデコードしjson_decode、値を int に解析して修正し、文字列を再エンコードすることです。

2 つ目は、自分の道を進み続けることです。ただし、JSON はかなり複雑な文字列であり、正規表現だけを使用して確実に解析することはできません。パターンが他の場所に表示されないと確信している場合は"natural_order":"value"、これを試すことができます。

$result = preg_replace('/"natural_order"\s*\:\s*"([-+]?[0-9]*\.?[0-9]+)"/', '"natural_order":$1', $string);

これは、カプセル化された任意のキーに一致する必要があり、その後にコロン、カプセル化された有効な浮動小数点数が続きます。コロンの周りにスペースがある場合のエスケープもあります。

于 2011-08-11T03:58:00.300 に答える