У меня есть некорректная строка json как {"subject": "tv 60" new "," body ":" contact me for detail "}.
И я пытаюсь использовать php preg_replace для правильной этой строки json, но сбой.
Помогите мне создать регулярное выражение, чтобы заменить "to/".
Заранее спасибо.
Предполагая, что символы '{', ':' и ',' в вашем JSON не имеют никакого промежутка между ними и двойными кавычками, решение может быть следующим:
$sanitizedJsonString = preg_replace('/([^:,{])"([^:,}])/', "$1".'\"'."$2", $yourMalformedJsonString);
Он находит все блокировки, которым не предшествуют символы '{', ':' или ',' и не сопровождаются символами ':', ',' или '}' и заменяет их символом '\'.
Надеюсь, он решает ваши проблемы, однако имейте в виду, что есть некоторые особые случаи, в которых этот подход терпит неудачу: например, если внутри вашего искаженного JSON у вас есть слово внутри blockquotes, за которым следует запятая:
{"subject":"tv 60" new","body":"contact "me", for detail"}
у вас все еще будет недействительный JSON:
{"subject":"tv 60\" new","body":"contact \"me", for detail"}
Если вам нужно более надежное решение, я согласен со Стивом П., вам нужно реализовать скрипт, который анализирует вашу строку и, если потребуется, заменяет блокировки.
$string =~ /(?!<[\{:,])\"(?!\s*[:,\}]/\\"/g
Это регулярное выражение ищет любое ", которое НЕ следует a: a или {и НЕ следует a: a или a} и цитирует его с символом \. Это должно работать для вас.
Если вы не являетесь регулярными выражениями для проверки ключей/значений перед вставкой в объект JSON, использование регулярных выражений не является хорошим способом для проверки данного объекта JSON.
Даже если вы пытаетесь проверить при вставке, кажется, что regex переполнен, и вместо этого вы можете просто использовать различные вспомогательные методы или просто перебирать необработанную строку и при необходимости заменять.
to /
в вашем JSON ...