큰따옴표가 없는 JSON 값 부분에 큰따옴표를 추가하는 정규식 작성
P粉231112437
2023-08-17 19:06:54
<p>다음과 같이 잘못된 형식의 JSON 문자열이 많이 있습니다. </p>
<pre class="brush:php;toolbar:false;">{
"ID":23424938,
"이름":aN,
"ref":aN,
"줄":aN,
"고양이":{},
"src":[],
"코드":"SA",
"유형":d,
"사양":[i,j],
"아이":a
}</pre>
<p>JSON 값을 큰따옴표로 묶는 정규식을 작성하려고 하는데 성공하지 못했습니다. </p>
<p>결국 <code>/":([^"d{[]+?[^,}]?)/</code>를 사용하여 배열 내부의 값을 제외한 모든 것을 수정했습니다. , 예를 들어 <code>[i,j]</code>는 <code>["i","j"]</code>로 변환되지 않습니다. </p>
<p>괄호 안의 값에 대해 도움을 주실 수 있나요? </p>
<p>https://regex101.com/r/CGskmy/1</p>
이 작업은 모호성 때문에 다소 어려울 것입니다. 예를 들어
{ "x": [y] }
是变成{ "x": "[y]" }
还是变成{ "x": ["y"] }
?我会假设未加引号的字符串不包含 JSON 控制字符,例如'[', ']', '{', '}', '"', ':', ','
.PCRE를 사용하여 가능한 PHP 기능인 명명된 캡처 그룹을 사용하면 이 작업을 수행할 수 있다고 생각합니다. 교체를 수행하려면 일부 프로그래밍이 필요합니다. 모든 일치 항목을 교체하지 않기 때문에 일반적인
preg_replace
작업으로는 충분하지 않습니다.제가 생각해낸 방법이에요. 먼저, 인용된 문자열을 일치시키고 무시합니다. 둘째, 숫자를 일치시키고 무시합니다. 마지막으로 따옴표가 없는 문자열을 일치시키고 "unquoted"라는 캡처 그룹에 저장합니다. PCRE는 일치하는 순서대로 이러한 대안을 일치시키려고 시도합니다. 인용되지 않은 문자열은 인용된 문자열과 숫자가 일치할 수 없는 경우에만 일치됩니다. 이것이 이 접근법의 핵심입니다.
따옴표가 없는 모든 문자열을 일치시키고 나면 출력 문자열을 대체 문자열과 연결하기만 하면 됩니다. 이는 일치 항목을 반복하고 문자열 조각을 출력에 복사하여 수행됩니다.
으아악저는 전체 JSON 숫자 구문이나
true
、false
或null
과 같은 JSON 구문을 다루지 않습니다. 이 답변이 출발점이기를 바라며 필요에 맞게 조정할 수 있기를 바랍니다.InSync는 명명된 캡처 그룹을 사용하지 않고 대신 PCRE에 원하지 않는 일치 항목을 건너뛰도록 지시하는 멋진 정규식을 제공합니다.
으아악