ugrás a tartalomhoz

Reguláris

gtoma · 2013. Nov. 9. (Szo), 18.19
Sziasztok!

Sajnálatosan belefutottam egy problémába.

jsont kellene printelnem, úgy hogy "function" is van benne.
a json_encode azonban azt is idéző jelekbe rakja.

pl.: {"message":"Hello","func":"function(){}"}

találtam rá egy megoldást:
itt

sajnos azonban hibaüzenetet kapok:
preg_replace_callback(): Compilation failed: missing ) at offset 30 in

rákerestem a hibára, és ezt találtam:
itt

úgy tűnik a reguláris kifejezés nem jó. Azonban sajnos abban elég gyenge vagyok. :(

Valakinek esetleg van 5lete?

function json_func_expr($json) {
    return preg_replace_callback(
        '/(?<=:)"function((?:(?!}").)*}"/',
        'json_strip_escape',
        $json
    );
}
 
function json_strip_escape($string) {
    return str_replace(array('"','/','"','n','t'),array('"','/','"','',''),substr($string[0],1,-1));
}
 
1

Zárójel

complex857 · 2013. Nov. 9. (Szo), 23.42
Ha jól értem a dolgot, az első linken lévő blogpost inkább javascript object literalt szeretne generálni nem json-t (mint írja is, " JavaScript function expression is not JSON"). Valószínűleg a postban is linkelt Zend_Json libbel (lehet csak mint komponens használni, nem kell a teljes zend frameworkot magadra rántani) jobban jársz hosszú távon, mindenesetre itt egy patcholt verzió a fenti kódbol:
function json_func_expr($json) {
    return preg_replace_callback(
        '/(?<=:)"function((?:(?!}").)*})"/',
//                                     ↑
//                                     ╰╴ni!
        'json_strip_escape',
        $json
    );
}
function json_strip_escape($string) {
    return str_replace(
        array('\"','\/','\n','\t'),
        array('"', '/', '',  ''), 
        substr($string[0], 1, -1));
}

$json = json_encode(array('some'=>'function(foo, bar){""; /foo/; alert(\'Hello
    JavaScript Expression!\');}',));
print $jsonWithFunc = json_func_expr($json);
A fentieknek ez a kimenete:
{"some":function(foo, bar){""; /foo/; alert('Hello    JavaScript Expression!');}}
Ezt behajítva js konzolba a függvény meghívható, szintaktikailag rendben van.

A változásokról:
  • Regexp kapott +1 ")" -et. Azért a legvégére került, mert ez lenne a capture group amin a json_strip_escape futni fog később - vagy legalábbis ezt várnám, de a 0 -as indexet használja ergo a teljes matchet, szóval kitörölve első "(" -t is működne -, így a teljes function törzset kell megfognia (az ügyben kicsit bizonytalan vagyok mennyire működik jól egy bonyolultabb json -on ez az egyszerű regexp).
  • A json_strip_escape function belsejében lévő str_replace -nek nem sok értelme van a postban megjelent formában, ha megnézed az első három stringet önmagára cseréli. Itt egy gyakran előforduló worldpresses beállítási probléma áldozata lett a "\" jel az első tömb elemei elől (eggyel több stripslashes mint kéne) így ezeket pótoltam (hogy miért van két " az továbbra is rejtély előttem).
2

Siker!

gtoma · 2013. Nov. 11. (H), 10.39
Nagyon köszönöm. A megoldásod jó volt. Sikerült megoldanom a problémát. :)
3

Mellé

complex857 · 2013. Nov. 11. (H), 11.13
Azóta a linkelt blogpost írójának is sikerült megbirkóznia wordpress-el és mint kiderült, ő nem erre gondolt:
'/(?<=:)"function\((?:(?!}").)*}"/',

A problémát okozó "(" ezek szerint azért volt ott, hogyha a bemenet valami ilyesmi:
array('foo' => 'function{ keep me escaped "}')

Akkor arra ne illeszkedjen ("function" -al kezdődő értek, de "(" nélkül; más kérdés, hogyha teszel egy space -et nyitó "(" elé akkor se lenne jó... regexp nem kifejezetten jó eszköz ilyesmire) csak a wp megette a \ -t előle (mondjuk gyanús lehetett volna többi hasonlóképp járt részéből a kódnak '^.^).
4

JSON-ban adatokat küldünk,

inf · 2013. Nov. 12. (K), 21.22
JSON-ban adatokat küldünk, nem függvényeket, felejtsd el ezt az egészet, és keress más megoldást a problémádra!
5

+1

Pepita · 2013. Nov. 12. (K), 23.35
Idáig azon filóztam, hogy minek kell neki függvény JSON-ban...
6

Szintén +1

bamegakapa · 2013. Nov. 13. (Sze), 00.10
Ha függvény van benne, az már nem JSON.