蘇州軟件(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_decod>≈e($jsonString)即可(kě)實現(xiàn),解析後的(de)$♦是(shì)json對(duì)象,非常簡> ≠單;如(rú)果要(yào)轉成數(shù)組也(yě)很(hěn)簡單,多(duō)βγβ加個(gè)參數(shù),json_decode($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)而導緻jγ¥₽♥son無法解析。因為(wèi)這(zhè)是(shì)一(yī)個↑∞ (gè)接口,我們無法預知(zhī)內(nèi)容的(de♠≥)多(duō)少(shǎo),所以必須要(yào)徹底解決。問(wèn)題json 代碼如(rú)下(xià):
{... "detail":"<img align="absmiddle" £>§src="https://img.demo.com/xxx/i1/3252495915/O1¶₩ΩφCN019CuEk71tZ7DJ0QcF6_!!3252495915.jpg"><im×α∑¶g src="https://img.demo.com/xxx/i1/3252495915/O1πλCN01T7WRWm1tZ7DUVCMd4_!!325 ↓$2495915.jpg" align="absmiddle">", "count":§•®"876", ...}
可(kě)以看(kàn)到(dào),鍵 “detail”對(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òn∑© ÷g)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ōn∑"•↑g)過正則表達式進行(xíng)處理(lǐ),但(dàn)是(shì)如(r∑©★ú)何隻把上(shàng)面的(de)“detail”的(de)val¥σue部分(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ú)下(xià):
1.全局正則替換雙引号,進行(xíng)轉義為(wèi)\”;
2.全局正則替換起始的(de)雙引号;
3.全局正則替換key和(hé)value之間(jiān)的(de)雙引号;
4.全局正則替換key和(hé)value的(de)雙引号,val₩↕←ue是(shì)數(shù)組;
5.全局正則替換key和(hé)value的(de)雙引号,value是(sσ¥πhì)鍵值對(duì);
6.全局正則替換單行(xíng)結尾的(de)引号和(hé)逗号;
7.替換單行(xíng)結尾的(de)引号;
通(tōng)過以上(shàng)7步即可(kě)實現(xiàn)valγ≠εue中雙引号轉義,而不(bù)破壞json格式,jso≠>®★n可(kě)以正常解析,此方法經多(duō)次測&☆α試,完全沒有(yǒu)問(wèn)題,具體(tǐ¶γ )代碼如(rú)下(xià):
function escapeDoubleQuote($data){ ≈ $data = preg_replac♥♣☆e('/\"/','\\\\"', $data); //所有(yǒu)的¥₹α (de)雙引号進行(xíng)轉義 $da∞ε≈ ta = preg_replace('/\s\\\"/'÷↔∏÷,'"', $data); ₽ //替換起始的(de)雙引号 $δ♦∞♦data = preg_replace('/\\\":\\\"/',≈'":"', $data); /♥ /替換key和(hé)value之間(ji ÷♠ān)的(de)雙引号 $data = preg_replace('/\\\♥α←":\[/','":[', $data); >→×//替換key和(hé)value的(de)雙引号,value是(shì)數(shù)組 γ↕≈ε $data = preg_replace('/\\\":\{/','"β↕ :{', $data); //替換key≈&®和(hé)value的(de)雙引号,val →♣ ue是(shì)鍵值對(duì) $data = preg_repl÷πace('/\\\",/','",', $dat¶↓a); //替換單行(xí✔δ↑ng)結尾的(de)引号和(hé)逗号 $data≠÷× = preg_replace("/\\\\\"\s*\n/","\"\n", $data); λβ≠ //替換單行(xíng)結尾的(de)引号 α≠ $data = json_decode($data,true); ♦≈β return $data; }
為(wèi)了(le)解決這(zhè)個(gè)問(→≥≠"wèn)題,花(huā)了(le)我們不(bù)少(shǎo)時(sh₽∏í)間(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/phpchulijs€α↑onzhizhongdeshuangyinhaoyinhσ≤ao/
蘇公網安備 32059002004131号