蘇州軟件(jiàn)開(kāi)發根據最近(jìn)的(de)項目經曆總結出處理(l₹¥•ǐ)json值中的(de)雙引号問(wèn)題。
我們都(dōu)隻json是(shì)鍵值對(duì)存儲的(de),php在解ε↕®₹析json字符串時(shí)直接使用(yòng)自(zì)帶的(de)函數(×←∏shù)json_decode($jsonString)即可(kě)實現(xiàn↕>∞),解析後的(de)是(shì)json對(duì)象,非常簡單;如(rú)果要(yà™≥☆o)轉成數(shù)組也(yě)很(hěn)簡單,多(₹©'duō)加個(gè)參數(shù),json_deφ₽←code($jsonString,true).
最近(jìn)在項目中遇到(dào)個(gè) ≤json解析的(de)問(wèn)題,就σ♦∏(jiù)是(shì)json的(de)value (值)含有(yǒu)雙引号,因為(wèi)值的©₩(de)內(nèi)容是(shì)html代碼,按照(zhào)正常的(de)處理(l®÷ǐ)邏輯,雙引号在轉成json字符串時(shí)要(yào)進行(xíng)轉義,這(zhè)↑λ樣解析的(de)時(shí)候就(jiù)不(bù)會(huì)有₹∏(yǒu)問(wèn)題,但(dàn)是"α(shì)實際上(shàng)卻沒有(y₽∏ε≠ǒu)進行(xíng)轉義,從(cóng)而導緻json無法解析。因為(wèi)這(zhε≈è)是(shì)一(yī)個(gè)接口,我們無法預知(☆↓zhī)內(nèi)容的(de)多(duō)少(shǎo),所以必須要(&↕yào)徹底解決。問(wèn)題json 代碼如(rú)下(xiγ♣αà):
{... "detail":"<img align="absδ"§±middle" src="https://img.demo.com/xxx/i1/325249 ∞5915/O1CN019CuEk71tZ7DJ0QcF6_!!3252495915.jpg">≤→$€;<img src="https://₩☆₹✔img.demo.com/xxx/i1/3252495915/O1CN01T7WRWm€∏¥1tZ7DUVCMd4_!!3252495915.jpg" align="absmid♥'dle">", "count":"876", ...}
可(kě)以看(kàn)到(dào),鍵 “dγδ✔€etail”對(duì)應的(de)值雙引号內(nèi)還(hái)有(y>↑©ǒu)雙引号,現(xiàn)在需要(yào)把值內(nèi)的(de)雙≠"引号進行(xíng)轉義。
也(yě)曾百度解決辦法,但(dàn)是(sh$&ì)大(dà)都(dōu)千篇一(yī)律,有♣±σΩ(yǒu)的(de)說(shuō)用(yòng)addslashes(),∏€≠↕但(dàn)是(shì)會(huì)破壞json格式,無法解決,也α∑∑(yě)有(yǒu)的(de)說(shuō)用(yòσ€ng)js處理(lǐ),但(dàn)是(shì)都(d" ©ōu)已沒有(yǒu)真正的(de)解決方法,所以隻能(néng)自(zì)己想€σ♦辦法解決。
首先想到(dào)的(de)是(shì)ε€"÷通(tōng)過正則表達式進行(xíng)處理(lǐ),但(dàn)是(shì)如(rú)何隻把上×→✔(shàng)面的(de)“detail”的(de)value部分(fēn)找出¥≥,然後把其中內(nèi)嵌的(de)雙引号進行(xíng)替換轉義,想✘≠γ了(le)很(hěn)多(duō)、也(yě)嘗試寫了(le)很(hěn)多(duō)£↑δ正則表達式去(qù)處理(lǐ),但(dàn)是(shì"♦)都(dōu)不(bù)理(lǐ)想;最後想出了(le)個(gè)方案,還(h&₩λπái)是(shì)通(tōng)過正則,但(dàn)是✘σ(shì)采用(yòng)多(duō)個(gè)正則進行(xíng)♠' ≤配合的(de)方式,邏輯如(rú)下(x§♦☆☆ià):
1.全局正則替換雙引号,進行(xíng)轉義為(wèi)\”;
2.全局正則替換起始的(de)雙引号;
3.全局正則替換key和(hé)value之間(j♣₽αiān)的(de)雙引号;
4.全局正則替換key和(hé)value的(de)雙引号,value是($♣¶shì)數(shù)組;
5.全局正則替換key和(hé)value的(de)雙引号,value是(shìγ)鍵值對(duì);
6.全局正則替換單行(xíng)結尾的(de)引号和(hé)逗号;
7.替換單行(xíng)結尾的(de)引号;
通(tōng)過以上(shàng)7步即可(kě)實現(xiàn)value中雙引号轉義,而不••™δ(bù)破壞json格式,json可(kě)以正常解析,此''方法經多(duō)次測試,完全沒有(yǒu)問(wèn)題,具體(tǐ)代碼如(r•ú)下(xià):
function escapeDoubleQuote($γ•data){ $data = pre≠↑®<g_replace('/\"/','\\\\"', $data); ₩₽//所有(yǒu)的(de)雙引号進行(xíng)轉義 $data = ♠φ÷preg_replace('/\s\\\"/','"', €ε$data); //替換起始的(de)雙引号 $data = p≈$ reg_replace('/\\\":\\\"/',₹≈♣×'":"', $data); //替換key和(hé)value之間(jiān)的(dπ∞$e)雙引号 $data = preg_replace("§'/\\\":\[/','":[', $data); ♠↓£ //替換key和(hé)value的(de)雙引号¥φ✔ ,value是(shì)數(shù)組 $data = preg_replace('/± β\\\":\{/','":{', $data); ₩✘ //替換key和(hé)value的(dφ×♣e)雙引号,value是(shì)鍵值對(duì) $data = pr§eg_replace('/\\\",/','", ↑<', $data); //替換單行(xíng)結尾φ♣σ的(de)引号和(hé)逗号 $data = preg_≥↑αreplace("/\\\\\"\s*\n/","\"\n", $da'∏φta); //替換單行(xíng)結尾的(de)引号 $data = jsoε•n_decode($data,true); ∏≈α↑ return $data; }
為(wèi)了(le)解決這(zhè)個(gè)問(wèn)題,花(huā)了↔♥(le)我們不(bù)少(shǎo)時(s✔₽↕hí)間(jiān)去(qù)思考,才想出這(zhè)個(gè)解決方案,∏÷為(wèi)了(le)幫助有(yǒu)需要(yào)的(de)人( γ×rén),現(xiàn)在分(fēn)享給÷→大(dà)家(jiā),歡迎轉載讓更多(duō)人(rén)知(∞ zhī)道(dào)。
此文(wén)為(wèi)技(jì)術(shù)人(rén)員(yuán)原創,如(rú)需轉載€≥請(qǐng)注明(míng)出處:蘇州滴答(dá)軟件(jiàn)科(kē)技(jìΩ↓↓)–技(jì)術(shù)博客, 出處網址:/2019/01/08/ph✘∞'pchulijsonzhizhongdeshuan↑✘₹εgyinhaoyinhao/
蘇公網安備 32059002004131号