2016-04-30 21 views
0

私は私のウェブサイトで使用するためにJSONデータをフェッチしていると私はそれをエコーする必要があり、このような:PHP - 配列全体へのがhtml_entity_decode

<?php 
    $json = file_get_contents("/lang/translator.php"); // uses preg_replace to remove whitespace/newlines from my actual json file and then echo's it 
    $i18n = json_decode($json, true); 

    if (htmlentities($_GET['lang'], ENT_QUOTES) == 'en') 
    { 
     $arr = 'i18n_en'; 
    } 
    else if (htmlentities($_GET['lang'], ENT_QUOTES) == 'ru') 
    { 
     $arr = 'i18n_ru'; 
    } 
?> 

そして、私はこのようにそれを使用します。

<?php echo $i18n[$arr]['string_key']; ?> 

string_keyはJSON配列に応じて、自分のサイトの英語またはロシア語の翻訳をその価値に保持します。

問題:

хорошо --> &#1093;&#1086;&#1088;&#1086;&#1096;&#1086; 

ひとつひとつのキリル文字をHTMLエンティティに変換されます:

私はキリル文字(ロシア語)この問題が発生したを保持している私のJSONファイルをアップロード。だから私はそれに対処するためにhtml_entity_decode()を使用することができたが、これを行うには時間がかかることを想像してすべて<?php echo $i18n[$arr]['string_key']; ?>私は自分のコードで呼び出してください。その周りに何か方法はありませんか? $i18nhtml_entity_decode()に渡そうとしましたが、array of stringsではなく、stringが必要です。何か案は?

私のJSONの例:

{ 
    "i18n_en": 
    { 
     "key0": "value0", 
     "key1": "value1" 
    }, 
    "i18n_ru": 
    { 
     "key0": "value0", 
     "key1": "value1" 
    } 
} 
+0

なぜ '$ _GET'値で' htmlentities'を呼び出すのですか? 'htmlentities'は、ページに値を表示するときにのみ使用し、HTMLとしてレンダリングさせたくない場合に使用してください。 – Barmar

+0

私はこれをハッカーの攻撃から守るためには良い習慣だと思っています。 –

答えて

0

、あなたはforeachループを使用して、指定した言語ですべての文字列にhtml_entities_decode()を適用することができます。

このような何か:

if (htmlentities($_GET['lang'], ENT_QUOTES) == 'en') 
    { 
     $arr = 'i18n_en'; 
    } 
    else if (htmlentities($_GET['lang'], ENT_QUOTES) == 'ru') 
    { 
     $arr = 'i18n_ru'; 
    } 

foreach ($i18n[$arr] as &$myString) { 
    $myString = html_entity_decode($myString); 
} 

編集。修正可能な2つの解決策Warning: Illegal string offset 'i18n_en'

1:

foreach ($i18n[$arr] as &$myString) { 
    if(isset($myString)){ 
     $myString = html_entity_decode($myString); 
    } 
} 

2.

foreach ($i18n[$arr] as &$myString) { 
    $myString = html_entity_decode($myString, ENT_COMPAT, 'UTF-8'); 
} 

それとも、両方を組み合わせました。これがうまくいくかどうか教えてください。

+0

これは動作しますが、新しい文字列を 'echo'する方法はありますか?私は 'echo $ myString [$ arr] ['key'];'を実行しようとしましたが、警告:不正な文字列オフセット 'i18n_en'が出ます。 –

+0

うーん...おそらくそれらの文字列のいくつかは空ですか? – nanocv

+0

はい、ロシア文字列の約2〜3は空です。 –

0

あなたは配列内の各アイテムの上に関数を呼び出すためにPHPのarray_map()機能を使用することができます。例を以下に示す。

$decodedArray = array_map("decode",$i18n); 

function decode($toDecode) { 
    return html_entity_decode($toDecode); 
} 
1

あなたがarray_mapを使用することができ、文字列の配列にhtml_entities_decode()を実行したい場合。このように:あなたは$arrを設定したら

$resultArray = array_map("html_entities_decode", $inputArray);

+0

私はこれを受け取ります: '警告:html_entity_decode()は、パラメータ1が文字列、array given ... 'とします。 –

+1

これは' html_entities_decode'ではなく 'html_entity_decode'です。 – Pierre