Почему так странно ищет substr?
Во-первых в этой строке есть кириллица, а значит нужно использовать функции для работы с многобайтовыми строками.
Во-вторых переменные $posnamevalstart и $posnamevalend у вас имеют одинаковые значения. Раз вы ищете в обеих переменных одинаковые значения, то нужно смещать начальную точку:$posnamevalend = mb_strpos($findstr, "\"", $posnamevalstart + 1);
В-третьих третьим параметром в функции substr() передается ДЛИНА ВОЗВРАЩАЕМОЙ СТРОКИ. Значит нужно написать эту строку следующим образом:$namevalue = mb_substr($findstr, ($posnamevalstart + 1), ($posnamevalend - $posnamevalstart - 1));
Ну и самое главное - зачем вы вообще это делаете? Если просто понять как работать с strpos() и substr() то окей. А так у вас там обычная сериализованная строка (только почему-то обрезанная вами), которая представляется в массив функцией unserialize()
1. это не JSON, а сериализованная строка
2. возможно из за мультибайтовой кодировки https://www.php.net/manual/ru/function.mb-substr.php