다음 코드가 까닭 없이 오류를 발생시키는 것처럼 보인다면:
$bar = json_decode($foo);
다음 코드로 시도해 보라.
$bar = json_decode(
preg_replace('/\r|\n/', '\n',
preg_replace('/\t/', '\t',
trim($foo)
)
)
);
사용자 JSON 입력에는 줄바꿈 문자, 탭 문자가 당연히 들어갈 수 있다. PHP의 json_decode()
는 이 처리를 성공적으로 실패한다.
소프트웨어 라이센스 문제로 인해 이전
json
모듈이jsond
모듈로 교체되었습니다. (중략) 지금은 변경 사항이나 해결 방법에 대한 정보가 많지 않지만 문자열[\0x00-\0x1F]
안의 모든 제어 문자 가 오류를 발생시키는 것을 볼 수 있습니다 . 불행히도 이 동작은 JSON 표준에 따라 올바른 것 같습니다 . 출처
그래서, 사용자 입력 어딘가가 진짜로 줄바꿈을 하고 있다면 그 줄바꿈은 \n
으로 바뀌어야 하며, 실제로 탭이 들어가 있다면 그 탭은 \t
라는 표기로 대체되어야 한다. 위 코드가 하는 일은 딱 그것뿐이다.
뭐 애초에 사용자 입력이라는 것 자체가 위생 처리와 정규화를 꼭 해야 하는 대상이니... 너무 띠껍게 생각하지는 말자.