2

特定の形式の文字列を配列に変換することに行き詰まっています。を使用して文字列を分割explodeすることは正しいアプローチではないようで、私は正規表現があまり得意ではありません。私の質問は、次の文字列を配列に変換するにはどうすればよいですか?

文字列の現在の形式

maxWidth: 800,
openEffect: elastic,    
closeEffect: elastic,
helpers : {
       title : {
             type: outside
           },
       thumbs : {
              width  : 50,
              height : 50
            }
      }

目的の配列

array(
  'maxWidth' => 800,
  'openEffect' => 'elastic',
  'closeEffect' => 'elastic',
  'helpers' => array(
               'title' => array('type' => 'outside'),
               'thumbs' => array('width' => 50, 'height' => 50)
             )
)

どんな助けでも大歓迎です。

応答に基づいて編集:

文字列は JSON のように見えますが、JSON ではありません。その形式でのユーザーからの単なる文字列入力です。入力は通常のユーザーからのものになるので、シンプルに保ちたいと思います。通常のユーザーが有効な JSON を入力する可能性は最小限です。

4

3 に答える 3

2

あなたの例の文字列は、ほぼ有効な JSON (JavaScript Object Notation) 構造です!

有効な JSON としての文字列は次のようになります。

 {
    "maxWidth": 800,
    "openEffect": "elastic",
    "closeEffect": "elastic",
    "helpers": {
        "title": {
            "type": "outside"
        },
        "thumbs": {
            "width": 50,
            "height": 50
        }
    }
}

したがって、私たちのアプローチ (@WiseGuy によって提案されているように) は、最初にいくつかの文字を挿入してpreg_replace文字列の初期化を有効な JSON に変換することです。

$str = preg_replace('/\b/' , '"' , $str);
$str = '{'  . $str . '}';

上記の正規表現は、Word Boundariesアンカーを使用してすべての単語を引用符で囲みます。次に、全体を中かっこで囲むと、ほら、x 言語互換のオブジェクト形式ができました。

標準関数を使用してオブジェクトを生成できるようになりました。

$objUserConfig = json_decode($str, true);

JSON に関する優れた初心者向けチュートリアル: http://code.drewwilson.com/entry/an-introduction-to-json

http://jsonlint.com/などのリンター ツールを使用して、JSON を検証します。これを使用して例をデバッグし、例の適切な JSON に変換しました。

于 2013-10-04T16:25:20.513 に答える
1

入力文字列は json 形式のように見えます。PHP はjson_decode()json 文字列をオブジェクトに変換する必要があります。

配列に変換するには、以下のコードを使用します。

json_decode($jsonStr, true);

参照: http://php.net/manual/en/function.json-decode.php

于 2013-10-04T16:26:57.157 に答える
1

編集:
PHP 宣言された配列の静的な表現ではなく、配列の印刷出力を表示していることはわかっています。 これは、その配列
に解析できるものに変換する方法の単なる例です。
PHPに動的に実行する機能があるかどうか(わかりません)。

ファイルを変換し、$str で読み込みます

この順序で、$str に対して正規表現を実行します。
それぞれがグローバルフラグです。

(?i)([a-z]+)'$1'
(?i)(?<=[a-z]')\s*:(?=\s*[^{\s])=>
(?i)(?<=[a-z]')\s*:\s*{=> array(
}_)

最後に、しかし、静的 配列$newstr = "array(\n$str\n)"
としてphpパーサーによって読み取ることができるこのようなもの。
どのように変数に動的に解釈されるのかはわかりません。
Perl はこれを行うことができます。

于 2013-10-04T16:42:33.663 に答える