Экранирование в JavaScrip

Роберт

Аналитик
Экранирование в JavaScrip

Код:
<form name=Forma>
<input type=text name=Pole>
<input type=button onClick='Forma.Pole.value="aa\'a"'>
</form>
Почему в данном случае не экранируется апостроф?
aa\"a выводит aa"a
aa\'a выдаёт ошибку

Если посмотреть на эту страницу через IE WebDeveloper то он показывает:
Код:
<HTML><HEAD>
<FORM name=Forma></HEAD>
<BODY><INPUT name=Pole> <INPUT onclick='Forma.Pole.value="aa\' type=button a??> </FORM></BODY></HTML>
тоесть на апострофе идёт обрыв onClick несмотря на то что перед ним стоит символ экранирования
 

AmdY

Пью пиво
Команда форума
вот именно потому что в данном случае в html, а не javascript
 

A1x

Новичок
по идее ошибка происходит раньше чем дело доходит до джаваскрипта - на этапе разбора хтмл. Браузер не может распарсить атрибут=значение. Поменяйте местами кавычки

<input type=button onClick="Forma.Pole.value='aa\'a'">
 

Роберт

Аналитик
Точно... :(
Значит тут только заменой на &apos; выходить из положения?
Если поменяю местами кавычки , то не будет проходить строка aa\"a :)
 

Wicked

Новичок
PHP:
<input onClick="<?php print htmlspecialchars("alert(" . json_encode(strval("a'\"a")) . ")", ENT_QUOTES) ?>">
 

Роберт

Аналитик
Код:
Оказалось сложней.
Апостров надо менять на & #39;
А кавычку можно только экранировать
Если вместо кавычки выводить & quot; то происходит ошибка.
При строке:
 
<input type=button onClick='Forma.Pole.value="aa& quot;a"'>

через IE WebDeveloper видно что в браузере это сразу интерпретируется как

<INPUT onclick='Forma.Pole.value="aa"a"' type=button>



Ещё более интересным оказалось увидеть что будет при 

<input type=button onClick='Forma.Pole.value="aa& #39;a"'>

в этом случае IE заменил апострофы на кавычки , а кавычки на quot
вот что у него во внутреннем представлении:

<INPUT onclick="Forma.Pole.value=& quot;aa'a& quot;" type=button>
пришлось всё написать в теге кода , так как иначе форум меняет quot; и #39; на кавычки и апостроф
 

Духовность™

Продвинутый новичок
PHP:
    /**
     * Метод формирует строковое значение 
     * для confirm-метода в JavaScript.
     * 
     * @access public
     * @param string
     * @return string
     */
    public function confirm($in)
    {
        $in = str_replace("\n", chr(10), $in);
        $in = str_replace("\r", '', $in);
        $in = str_replace("\t", chr(9), $in);

        $in = htmlspecialchars($in, ENT_COMPAT);
        $in = addslashes($in);

        $in = str_replace(chr(10), "\\n", $in);
        $in = str_replace(chr(9), "\\t", $in);

        return $in;
    }
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
В поиск.
Помнится был на форуме ну очень жирный топик по этому вопросу.
 

Роберт

Аналитик
Вот разница между решениями предложенными Wicked и triumvirat
буду писать в тегах php-кода , так как форум ведёт себя странно - например в тегах CODE в режиме "Просмотр (preview)" нормально показывал все quot и #39 а уже когда нажал на "Добавить ответ" все quot заменились на кавычки , а #39 на апострофы , тоесть работает не правильно.
PHP:
для каждой функции одинаковый результат были и при "a' \"a" и при 'a\' "a'
однако между самими функциями результаты были разными.
Запустив
---
echo json_encode(strval("a' \"a"))
echo htmlspecialchars(json_encode(strval("a' \"a")),ENT_QUOTES)
echo confirm("a' \"a")
---
получили:
---
"a' \"a"
&quot;a&#039; \&quot;a&quot;
a/' &quot;a   <-тут я поставил касую в обратную сторону так как форум глючит и в php-коде (вместо А косая апостоф он пишет просто А)
---
тоесть получилось что у Wicked заэкранировны кавычки , а у triumvirat заэкранированы апострофы
поскольку у Wicked сохраняются начальные и конечных кавычки то при выводе информации не надо думать о том что ты используешь " или '
обе строки работают одинаково:
<input onClick='alert(<?=htmlspecialchars(json_encode(strval("a' \"a")),ENT_QUOTES)?>)'>
<input onClick="alert(<?=htmlspecialchars(json_encode(strval("a' \"a")),ENT_QUOTES)?>)">

а у triumvirat надо всегда точно помнить какие кавычки внешние , а какие внутренние
<input onClick="alert('<?=confirm("a' \"a")?>')"> <- работает
<input onClick='alert("<?=confirm("a' \"a")?>")'> <- НЕ работает
 

Wicked

Новичок
да уж... для меня экранирование под каждый конкретный синтаксис настолько очевидно, что даже думать не нужно. Задача тупо распадается на две независимые задачи:
1) составить валидный JS-код
2) составить валидный HTML-код

В первом случае я всегда использую json_encode как единственно верный вариант.
Во втором я всегда использую htmlspecialchars по той же самой причине.
 
Сверху