3

PHPシリアル化のjson_encodeを介した配列があります:

json_encode(array('pattern' => '^(?:/?site/(?[\w\-]+))?(?:/?intl/(?[a-z]{2}(?:\-[a-z]{2})?)/?)?(/?(?.*))'));
// output json: {"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}

Javascriptでデコードしようとしました:

JSON.parse('{"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}');

次に、「Uncaught SyntaxError: Unexpected token w」というエラーが発生する理由がわかりません?? PHP と Javascript JSON パーサーの違いは?

4

1 に答える 1

4

問題は、JSON.parse() を使用していて、JSON 文字列を一重引用符で囲んでいるためです。

したがって、エスケープされた正規表現文字列は、外側の文字列リテラル (一重引用符で囲まれた) の解釈でエスケープされず、文字列の値の解釈で混同されpattern(二重引用符で囲まれ)、最終的に JavaScript が解読しようとして窒息します。 "\w".

次の例では、JSON をそのまま宣言にレンダリングする PHP を模倣しており、JS コンソールで正常に動作します。

var json = {"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}

JSON.parse を使用する場合は、最初に PHP で JSON 文字列をダブルエスケープする必要があります

$json = json_encode(array('pattern' => '^(?:/?site/(?[\w\-]+))?(?:/?intl/(?[a-z]{2}(?:\-[a-z]{2})?)/?)?(/?(?.*))'));
$json = str_replace('\', '\\', $json);
// output json: {"pattern":"^(?:\\/?site\\/(?[\\\\w\\\\-]+))?(?:\\/?intl\\/(?[a-z]{2}(?:\\\\-[a-z]{2})?)\\/?)?(\\/?(?.*))"}

次に、JS で:

var json = JSON.parse('{"pattern":"^(?:\\/?site\\/(?[\\\\w\\\\-]+))?(?:\\/?intl\\/(?[a-z]{2}(?:\\\\-[a-z]{2})?)\\/?)?(\\/?(?.*))"}')
于 2013-07-02T02:57:16.083 に答える