0

このタイプの入力文字列を検証するphp正規表現を作成してみます。

 {name:'something name here',type:'',id:''},{name:'other name',type:'small',id:34},{name:'orange',type:'weight',id:28}

等...

したがって、それぞれに3つのフィールドが含まれるjsonのリストです:name、type、id.Field nameは常に存在しますが、代わりにtypeとidを一緒に空の文字列('')にすることができます。次に、有効な形式である場合はコンマで展開し、json文字列の配列を取得できます。

どのようにできるのか?

UPDATE それはあなたが言うことができるように有効なjsonではありませんが、ユーザーがタグを置く入力フィールドがあり、そのタグの名前、タイプ、IDを追跡したいと思います。例:tag1(name、type、id)、tags2(nameのみ)、tags3(name、type、id)。だから、私はその形式で文字列を投稿できると思います:

{'name':'test','type':'first','id':3},{'name':'other','type':'second','id':45}, etc

ただし、この文字列を正規表現で検証する必要があります。できます

$data = explode(',',$list);

そして私はします:

foreach($data as $d){
  $tmp = json_decode($d);
  if($tmp == false) echo 'error invalid data'; 
}
4

2 に答える 2

1

そのための正規表現は必要ありません。これを使用してください:

var_dump(json_decode($json, true));

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

于 2012-04-29T20:54:12.283 に答える
1

Guboが指摘したように、これは有効なJSONエンコード文字列ではありません。ただし、スクリプトで処理する実際のデータが有効な場合は、正規表現を探して間違ったツリーを吠えています... PHPには、正規表現よりもはるかに高速にJSON文字列を解析する関数がたくさんあります。

$string1 = "{name:'something name here',type:'',id:''},{name:'othername',type:'small',id:34},{name:'orange',type:'weight',id:28}";
$string2 = '[{"name":"something name here","type":"","id":""},{"name":"othername","type":"small","id":"34"},{"name":"orange","type":"weight","id":"28"}]';

$string2有効なJSON形式のデータはどこにありますか。データが有効なJSON文字列である場合は、次のコードで十分です。

$parsed = json_decode($string2);
//$parsed[0]['name'] return 'something name here'

ただし、無効なJSON文字列を処理している場合は、状況が少し複雑になります...まず、オブジェクトプロパティ(またはPHPで使用される配列キー)が不足している場合は、簡単に修正できます。これである:

$parsed = json_decode('['.$string1.']');

本当にそれらを別々に解析したい場合:

$separated= preg_split('/(?<=[\}]),/',$string1);

しかし、なぜあなたがそれをしたいのか分かりません。ここでの最大の問題は、プロパティ文字列(またはキー)に引用符がないことです。これらの文字列を引用できる正規表現(テストされていない)をまとめました。

$parsed = json_decode(preg_replace('/(?<=[\{,])([a-z]+)/',str_replace('\'','"',$string1)));

最後の正規表現はテストされていないため、期待どおりに機能しない可能性があります...ただし、途中で役立つはずです...最後の例では、他のすべての例に同じルールが適用されます:引用符と括弧がある場合は、を使用json_decodeします。括弧がない場合は、それらも追加します...

ここはかなり遅くなっているので、今は寝ています...この答えに、誰も理解できないタイプミスや文章が詰まっていないことを願っています。もしそうなら、私はお詫び申し上げます。

于 2012-04-29T21:09:41.197 に答える