Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   объекте есть свойство, текст с вдойными ковычками, как его целиком вытащить (https://javascript.ru/forum/css-html/76475-obekte-est-svojjstvo-tekst-s-vdojjnymi-kovychkami-kak-ego-celikom-vytashhit.html)

Sergey1986 15.01.2019 01:03

объекте есть свойство, текст с вдойными ковычками, как его целиком вытащить
 
Доброго времени суток!

есть объект

data {
0: {id: "1", name: "ООО "Газпром""}
1: {id: "2", name: "ООО 'Шел'"}
}

так вот если
$(data[0].name)
выведет только ООО

а если
$(data[1].name)
выведет только ООО 'Шел'

вопрос, как мне вытаскивать с двойными ковычками? что бы текст не обрубался? З


заранее спасибо!

Sergey1986 15.01.2019 01:11

думаю стоит добавить это приходит json и это данные после JSON.parse

Sergey1986 15.01.2019 01:14

я так понимаю надо на этапе encode данныех в php все ковычки заикронировать?

laimas 15.01.2019 01:16

"ООО "Газпром"" - такого не может быть, поэтому и получаем только первое заключенное в кавычки. Это ошибку будет видно и при подсветке кода:

data {
0: {id: "1", name: "ООО "Газпром""}
1: {id: "2", name: "ООО 'Шел'"}
}


Причина - невалидный JSON.

laimas 15.01.2019 01:29

Цитата:

Сообщение от Sergey1986
я так понимаю надо на этапе encode данныех в php все ковычки заикронировать?

json_encode это так по умолчанию делает. Вот такой валидный будет по умолчанию

[{"id":1,"name":"\u041e\u041e\u041e \"\u0413\u0430\u0437\u043f\u0440\u043e\u043c\""},{ "id":2,"name":"\u041e\u041e\u041e '\u0428\u0435\u043b'"}]

или с константой JSON_UNESCAPED_UNICODE

[{"id":1,"name":"ООО \"Газпром\""},{"id":2,"name":"ООО 'Шел'"}]

Sergey1986 15.01.2019 01:37

хм...вот в response все так и вяглядит
"data":{"ludaed":[{"id":"1","name":"Человек \"Махно\""},{"id":"2","name":":Животно е 'Мышка'"}]}

после я его через JSON.parse

ничего не понимаю.....))))

Sergey1986 15.01.2019 01:38

в коносоли то если ручками набрать этот свойство...оно выдаеться как положено с ковычками (не обрубаеться)

Sergey1986 15.01.2019 01:40

и при выполнении скрипта console.log(data.ludaed[0].name)
выводит
Человек "Махно"

laimas 15.01.2019 01:49

Вы либо что-то не то делаете, а json нормальный, либо даже и не знаю что и сказать можно. Во-первых при том, что показывается ну не может парсер получить объект никак:

var jsn = '{"id":1,"name":"ООО "Газпром""}';

try {
    jsn = JSON.parse(jsn)
} catch (e) {
    alert(e) //ошибка в позиции кавычки
}


А если получаете, то все не так как представляется вам.

Sergey1986 15.01.2019 01:50

а вот есть это переменную в ставить в
' + strVar + '
обрубает
((((

Sergey1986 15.01.2019 01:51

при обработки ответа с сервера стоит
try {
jsn = JSON.parse(jsn)
} catch (e) {
alert(e) //ошибка в позиции кавычки
}

ошибка то не вываливаеться
а все норм
+ в консоли все бьеться...

laimas 15.01.2019 02:00

Sergey1986,
ищите причину ошибки, вы же не руками на сервере готовите json, может в исходных данных бардак, а потому и результат таков. Вот ваши данные и проблем не будет:

<?
if($_POST) {
    $a = (object)[
        ['id'=>1, 'name'=> 'ООО "Газпром"'], //пусть это имя в двойных кавычках  
        ['id'=>2, 'name'=> "ООО 'Шел'"] //пусть это имя в одинарных кавычках
    ];
    
    exit(json_encode($a, JSON_UNESCAPED_UNICODE));
}
?>
<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
$.post(location, {p:1}, function(d) {
    try {
        d = JSON.parse(d);
        alert(d[0].name+'\n'+d[1].name)
    } catch (e) {
        alert(e)
    }
})
</script>
</head>
</html>


А вы не выясняя причин, хотите методом научного тыка выкрутиться.

Sergey1986 15.01.2019 02:36

ОКАЙ, поэтапно
из бд
array(2) {
[0]=>
array(2) {
["id"]=>
string(1) "1"
["name"]=>
string(25) "ООО "Сортир 123""
}
[1]=>
array(2) {
["id"]=>
string(1) "2"
["name"]=>
string(15) "ООО 'Хер'"
}
}

$data = ['data' => $этот_массив, 'шляпа' => 'еще мусора']

далее это в
$response = json_encode($data, JSON_UNESCAPED_UNICODE );
exit ($response);

обработка ответа

{..... "data":{"list":[{"id":"1","name":"ООО \"Сортир 123\""},{"id":"2","name":"ООО 'Хер'"}]}}

далее распарсить

data:
list: Array(2)
0: {id: "1", name: "ООО "Сортир 123""}
1: {id: "2", name: "ООО 'Хер'"}
length: 2
__proto__: Array(0)
__proto__: Object

вроде все честно...

1: {id: "2", name: "ООО 'Хер'"} это выводиться все ок, так как там одинарные ковычки

0: {id: "1", name: "ООО "Сортир 123""} а вот это обрубаеться....

Sergey1986 15.01.2019 02:44

надо добавить что в консоли браузера все выволдиться как положено
а вот если
запихивать в

html += '... '+ data.list[0].name + '....';
$('#idt').append(html);

выводит ООО при двойных ковычках
а при одинарных ввыодит весть текст

laimas 15.01.2019 02:53

Если так [{"id":"1","name":"ООО \"Сортир 123\""},{"id":"2","name":"ООО 'Хер'"}] и это ajax, то проблем быть не должно. Ну это тоже самое как alert("A \"B\""), обычное экранирование. Что-то тут не то.

Sergey1986 15.01.2019 02:59

упихваю это вот сюда
html += '<input id="" type="text" name="contractors-name" value="' + json.data.list[1].name + '" autocomplete="off" required>';

laimas 15.01.2019 03:03

Ну так чего вы хотите, вы пишите об ошибке, которой по идее быть не должно, коли в консоли есть. А оказывается вы впихиваете в двойные кавычки двойные кавычки - value="' + json.data.list[1].name + '"

Посмотрите html после этой операции, станет понятно причина - JSON.parse тут вообще не причем. Экранировать надо кавычки в name для такой вставки.

Sergey1986 15.01.2019 03:12

точно, ни какой магии :-?

Sergey1986 15.01.2019 03:12

т.е. перед вставкой

laimas 15.01.2019 03:20

Цитата:

Сообщение от Sergey1986
т.е. перед вставкой

<input value="<?=htmlspecialchars('ООО "Газпром"', ENT_QUOTES)?>" />


О чем нибудь это говорит? Не хотите проблем подобных, значит пропускайте строковые значения через htmlspecialchars, то есть до декодирования json в вашем случае.

Sergey1986 15.01.2019 03:27

это же функция php, а я же в js вкарячиваю данные

это хорошая функция если ты ренлеришь html на сервере

Sergey1986 15.01.2019 03:28

ааа, т.е. пробежаться по массиву и пропустить это поле через эту функцию...понял попробую

Sergey1986 15.01.2019 03:28

Спасибо!

laimas 15.01.2019 03:28

Цитата:

Сообщение от Sergey1986
это же функция php

А вам json, что соседняя вкладка браузера на js формирует, а не сервер отдает?

laimas 15.01.2019 03:30

Цитата:

Сообщение от Sergey1986
т.е. пробежаться по массиву и пропустить

Ну можно и так

exit(htmlspecialchars(json_encode($array, JSON_UNESCAPED_UNICODE), ENT_QUOTES));


при выдаче клиенту.

Sergey1986 15.01.2019 03:30

:) :) :) :)

Sergey1986 15.01.2019 03:32

"А вам json, что соседняя вкладка браузера на js формирует, а не сервер отдает?"

сервер ))))))))

но потом то данные вставляюся в js который формирует html

вообщем пробывать буду

Спасибо!!!

Sergey1986 15.01.2019 06:44

exit(htmlspecialchars(json_encode($array, JSON_UNESCAPED_UNICODE), ENT_QUOTES));

этот вариант не прошел(((...
я думаю надо перед тем как вставить в html двойные ковычки заэкронировать или сменить...

laimas 15.01.2019 07:16

Не знаю как готовятся эти данные - если это набор с вложениями, то array_walk_recursive(), если это построчное получение рядов из ресурса, то array_map().

laimas 15.01.2019 07:49

Если и это по каким-то причинам не получится (сомнительно), то нужно не в атрибуты вставлять, а определять свойства

$('<input/>', {
    type: "text", 
    name: "contractors-name", 
    value: json.data.list[1].name,
    autocomplete: "off", 
    required: true
}).appendTo(...)


Часовой пояс GMT +3, время: 21:47.