Kaçış Karakterler Kaçış

6 Cevap php

PHP 5.3.0 uygulanan json_encode bitmask bayraklar, burada ben dize taklit çalışıyorum:

$s = addslashes('O\'Rei"lly'); // O\'Rei\"lly

json_encode($s, JSON_HEX_APOS | JSON_HEX_QUOT) şu çıkışlar yapıyor:

"O\\\u0027Rei\\\u0022lly"

Ve ben şu anda 5.3.0 daha yaşlı PHP sürümlerinde bu yapıyorum:

str_replace(array('\\"', "\\'"), array('\\u0022', '\\\u0027'), json_encode($s))
or
str_replace(array('\\"', '\\\''), array('\\u0022', '\\\u0027'), json_encode($s))

Hangi doğru aynı sonucu verir:

"O\\\u0027Rei\\\u0022lly"

Ben sorun anlama yaşıyorum why do I need to replace single quotes ('\\\'' ya da "\\'" [surrounding quotes excluded]) '\\\u0027' ile değil, sadece '\\u0027' .


Here is the code that I'm having trouble porting to PHP < 5.3:

if (get_magic_quotes_gpc() && version_compare(PHP_VERSION, '6.0.0', '<'))
{
    /* JSON_HEX_APOS and JSON_HEX_QUOT are availiable */
    if (version_compare(PHP_VERSION, '5.3.0', '>=') === true)
    {
        $_GET = json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT);
        $_POST = json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT);
        $_COOKIE = json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT);
        $_REQUEST = json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT);
    }

    /* mimic the behaviour of JSON_HEX_APOS and JSON_HEX_QUOT */
    else if (extension_loaded('json') === true)
    {
        $_GET = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_GET));
        $_POST = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_POST));
        $_COOKIE = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_COOKIE));
        $_REQUEST = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_REQUEST));
    }

    $_GET = json_decode(stripslashes($_GET));
    $_POST = json_decode(stripslashes($_POST));
    $_COOKIE = json_decode(stripslashes($_COOKIE));
    $_REQUEST = json_decode(stripslashes($_REQUEST));
}

6 Cevap

PHP string

'O\'Rei"lly'

literal değer almanın sadece PHP'nin yoludur

O'Rei"lly

kullanılabilecek bir dizeye. Bu dize addslashes çağrılması tam anlamıyla aşağıdaki 11 karakter değiştirir

O\'Rei\"lly

yani strlen(addslashes('O\'Rei"lly')) == 11

Bu json_escape gönderiliyor değerdir.

JSON ters bölü bir kaçış karakter, böylece, kaçtı edilmesi yani gerekiyor

\ olması \\

Ayrıca tek ve çift tırnak sorunlarına neden olabilir. Yani sorunları önlemek için bir şekilde onların unicode eşdeğer onları dönüştürmek. PHP'nin json_encode değişim kadar sonra VERIONS

' olması \u0027

ve

" olması \u0022

Yani bu üç kuralların uygulanması

O\'Rei\"lly

bize verir

O\\\u0027Rei\\\u0022lly

This string is then wrapped in double quotes to make it a JSON string. Your replace expressions include the leading forward slashes. Either by accident or on purpose this means that the leading ve trailing double quote returned by json_encode is not subject to the escaping, which it shouldn't be.

Yani PHP'nin önceki sürümlerinde

$s = addslashes('O\'Rei"lly');
print json_encode($s);

yazdırmak istiyorum

"O\\'Rei\\\"lly"

ve we want to change ' to be \u0027 ve we want to change \" to be \u0022 because the \ in \" is just to get the " into the string because it begins ve ends with double-quotes.

Biz olsun Yani bu yüzden

"O\\\u0027Rei\\\u0022lly"

Bu ters eğik yanı sıra teklif kaçıyor. Burada yapıyoruz gibi o hızla eğik çizgi sayma oyunları dönüşür gibi, kaçan kaçar ile ilgili zor bulunuyor. :-/

Eğer doğru anlamak, sadece kullanmak gerekir neden bilmek istiyorum

'\\\u0027' ve sadece '\\u0027'

Sen çizgi ve karakter unicode değerini kaçıyorlar. Bu ile orada bir kesme işareti koymak gerekir json söylüyorum, ama bir unicode onaltılık karakter kodu yanında olduğunu bilmek ters eğik çizgi ve u ihtiyacı var.

Bu dize kaçan beri:

$s = addslashes('O\'Rei"lly'); // O\'Rei\"lly

ilk ters eğik çizgi aslında kesme işareti önce ters eğik çizgi kaçıyor. Sonra bir sonraki eğik bir unicode karakter olarak karakterini tanımlamak için json tarafından kullanılan ters eğik çizgi kaçmak için kullanılır.

Eğer O'Reilly yerine O \ '\ Rei için algorythm appplying olsaydı "Lly sonra ikincisi yeterli olacaktır.

Bunu yararlı bulacağını umuyorum. Eğer json inşa nasıl daha fazla okuyabilir böylece onun belirgin zaten PHP anlamak çünkü ben sadece, bu bağlantıyı bırakın:

http://www.json.org/fatfree.html

Eğer json için bir dize kodlamak zaman, bazı şeyler ne olursa olsun seçenekler kaçtı gerekir. Diğerleri işaret gibi, bu '\' diye herhangi bir ters eğik json_encode üzerinden çalıştırmak katına çıkacaktır içerir. Önce de tırnak ters eğik çizgiler ekler addslashes, yoluyla dize çalışan bu yana, ekstra tersbölülerden bir sürü ekliyoruz. Aşağıdaki fonksiyon json_encode bir dize kodlamak nasıl taklit edecektir. Dize zaten tersbölüler ekledi vardı varsa, bunlar iki katına çıkacaktır.

function json_encode_string( $encode , $options ) {
    $escape = '\\\0..\37';
    $needle = array();
    $replace = array();

    if ( $options & JSON_HEX_APOS ) {
        $needle[] = "'";
        $replace[] = '\u0027';
    } else {
        $escape .= "'";
    }

    if ( $options & JSON_HEX_QUOT ) {
        $needle[] = '"';
        $replace[] = '\u0022';
    } else {
        $escape .= '"';
    }

    if ( $options & JSON_HEX_AMP ) {
        $needle[] = '&';
        $replace[] = '\u0026';
    }

    if ( $options & JSON_HEX_TAG ) {
        $needle[] = '<';
        $needle[] = '>';
        $replace[] = '\u003C';
        $replace[] = '\u003E';
    }

    $encode = addcslashes( $encode , $escape );
    $encode = str_replace( $needle , $replace , $encode );

    return $encode;
}

Sen gidiyorsun beri json_encode dize \' ilk kodlamak zorunda olacak \ ardından '. Yani \\ ve \u0027 sahip olacaktır. Bu sonuçları bitiştirme \\\u0027.

\ addslashes() json_encode() tarafından yeniden kaçtı olsun tarafından oluşturulan. Muhtemelen bu Doing json_encode($s, JSON_HEX_APOS | JSON_HEX_QUOT) outputs the following demek istedim ama herkes şaşkın, $str yerine $s kullanılır.

Eğer dize değerlendirmek ise "O\\\u0027Rei\\\u0022lly" JavaScript, size "O\'rei\"lly" alacak ve ben o not ne istediğinizi eminim. Bunu değerlendirmek, muhtemelen kaldırıldı tüm denetim kodları gerekir. Haydi, bir dosya içinde bu kurcalamak: alert("O\\\u0027Rei\\\u0022lly").

Sonuç: Büyük olasılıkla değil neye ihtiyacınız olduğunu, iki kez tırnak kaçan. json_encode zaten herhangi bir JavaScript ayrıştırıcı orijinal veri yapısını dönecekti böylece gerekli olan her şeyi kaçar. Sizin durumunuzda, size addslashes için çağrısından sonra elde etmiş dizedir.


Proof:

<?php $out = json_encode(array(10, "h'ello", addslashes("h'ello re-escaped"))); ?>
<script type="text/javascript">
  var out = <?php echo $out; ?>;
  alert(out[0]);
  alert(out[1]);
  alert(out[2]);
</script>