1. ホーム
  2. regex

[解決済み] JSONを検証するための正規表現

2022-12-26 13:05:33

質問

jsonのバリデーションを行うためのREGEXを探しています。

私はRegexの非常に新しいですし、私はRegexでパースが悪いことを十分に知っていますが、それは検証のために使用することができますか?

どのように解決するのですか?

はい、完全な正規表現による検証は可能です。

最近のほとんどの正規表現実装では、再帰的な正規表現が可能であり、完全なJSONシリアライズ構造を検証することができます。そのため json.org 仕様 を使用すると、非常に簡単です。

$pcre_regex = '
  /
  (?(DEFINE)
     (?<number>   -? (?= [1-9]|0(?!\d) ) \d+ (\.\d+)? ([eE] [+-]? \d+)? )    
     (?<boolean>   true | false | null )
     (?<string>    " ([^"\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " )
     (?<array>     \[  (?:  (?&json)  (?: , (?&json)  )*  )?  \s* \] )
     (?<pair>      \s* (?&string) \s* : (?&json)  )
     (?<object>    \{  (?:  (?&pair)  (?: , (?&pair)  )*  )?  \s* \} )
     (?<json>   \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* )
  )
  \A (?&json) \Z
  /six   
';

これはPHPでかなりうまく PCRE関数 . Perlでもそのまま動くはずです。そして、他の言語にも確実に適用できます。また、これは JSON テストケース .

よりシンプルなRFC4627の検証

よりシンプルなアプローチとして、以下のように最小限の一貫性チェックがあります。 RFC4627、セクション 6 . しかし、これはセキュリティ テストと基本的な非有効性の予防措置として意図されているだけです。

  var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
         text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
     eval('(' + text + ')');