Próbuję odczytać dane JSON, które zawierają cudzysłowy, które skutecznie wychodzą z ciągu i traktują następujący tekst jak zmienną. Jak temu zapobiec? Oto kanał JSON (jest wbudowany w silnik wyrażeń, więc zignoruj ​​nawiasy klamrowe):

<?php echo substr($_SERVER["REQUEST_URI"], strpos($_SERVER["REQUEST_URI"],"=")+1, strpos($_SERVER["REQUEST_URI"],"&")-strpos($_SERVER["REQUEST_URI"],"=")-1);?>([
{exp:channel:entries channel="blog" limit="10" dynamic_start="on" disable="member_data"}
{
    "title": "{exp:url_encode}{title}{/exp:url_encode}",
    "body": "{blog_one_liner}",
    "link": "{blog_image_link}",
    "img" : "{blog_image}"
},
{/exp:channel:entries}
]);

A oto parsowanie, które dzieje się w jquery:

function loadBlog(){
    $.getJSON("http://superfad.com/work/work_json?callback=?&test=test", blogLoaded);
}

    function blogLoaded(data){


        for (dataIndex in data) {
            var blogTitle = decodeURI(data[dataIndex].title);
            var blogContent = data[dataIndex].body;
            var blogLink = data[dataIndex].link;
            var blogImg = data[dataIndex].img;

            $("#blog_results").append('<li class="blog"><a href="' + blogLink + '" target="_blank"><img class="blog_img" src="' + blogImg + '"/></a><span class="blogtitle">'+ blogTitle + '</span> - '+ blogContent + '</li>');

        };
    }

Możesz zobaczyć, że próbowałem zakodować tytuł w silniku wyrażeń (który działa dobrze) i dekodować w javascript (który nie działa). Widziałem, że JSON ma jakąś funkcję linkify, ale nie mogłem wymyślić, jak to zrobić bez przełączania się na funkcjonalność AJAX JQuery. To, co chciałbym zrobić, to całkowicie uniknąć kodowania silnika wyrażeń i zrobić wszystko z JavaScript, jeśli to możliwe (i PHP, jeśli to konieczne).

0
mheavers 9 sierpień 2011, 01:00

2 odpowiedzi

Najlepsza odpowiedź

Czy kiedykolwiek próbowałeś "unescape('zakodowany ciąg')"? Aby rozwiązać problem „+”, możesz to zrobić

// Create a regular expression to search all +s in the string
var lsRegExp = /\+/g;
// Return the decoded string
return unescape(String(psEncodeString).replace(lsRegExp, " ")); 

Odniesienie: http://www.kamath.com/codelibrary/cl006_url.asp

1
Tae-Sung Shin 9 sierpień 2011, 01:21
Unescape działa, z wyjątkiem tego, że znaki + reprezentujące spacje (z silnika wyrażeń) pozostają.
 – 
mheavers
9 sierpień 2011, 01:16

Spróbuj z decodeURIComponent() zamiast decodeURI().

DecodeURI jest dla pełnych adresów URL, podczas gdy decodeURIComponent działa dla dowolnego ciągu.

2
guido 9 sierpień 2011, 01:11
Miałem ten sam problem co powyżej, ale tak, działa decodeURIComponent, dzięki.
 – 
mheavers
9 sierpień 2011, 01:31