Передача переменной PHP в JavaScript со специальными символами

#javascript #php #jquery

#javascript #php #jquery

Вопрос:

У меня есть кнопка с функцией onclick, где я отправляю несколько переменных php в свою функцию javascript. Все это работает нормально, за исключением случаев, когда у меня есть ‘ в тексте.

Итак, у меня была бы кнопка

 <button onclick="selected_comp('" . preg_replace("/r|n/", "", $comp_row['comments']) . "')"
  

тогда у меня была бы функция

 function selected_comp(comments){
console.log(comments);
}
  

Я пробовал preg_replace и json_encode, но оба выдают мне ошибки (json_encode выдает мне ошибку в целом, а с preg_replace это работает большую часть времени, но всякий раз, когда этот символ находится внутри комментариев, он не работает. Как я могу убедиться, что это обрабатывается как обычный текст, независимо от того, какой символ находится внутри.

ошибка: (индекс): 1 Неперехваченная синтаксическая ошибка: недопустимый или неожиданный токен

Ответ №1:

Исходя из того, как написан ваш PHP-код, если текст в $comp_row['comments'] text , то результирующий JS-код будет

 <button onclick="selected_comp('text')">
  

(где я добавил < и > для ясности).

Теперь, если текст есть text with ' embedded , это приведет к

 <button onclick="selected_comp('text with ' embedded')">
  

Тогда вы ясно видите, почему он выдает ошибку.

Существует множество различных решений, позволяющих избежать этого, например, предложенное @Terminus .
Но, возможно, это нелегко применить без глубокого изменения структуры вашего PHP-скрипта.

Итак, вот предложение, которое может показаться немного странным, но продолжает использовать вашу текущую организацию кода:

 button onclick="selected_comp('" . 
str_replace(["r", "n", "'"], ["", "", "\'"], $comp_row['comments']) . 
"')"
  

Сначала вы можете заметить, что я перешел с preg_replace() на str_replace() (в любом случае preg_replace() , это уже перебор).

И дело в том, что теперь не только r и n заменяются на «ничего», но и ' экранируются.

Ответ №2:

Если вы хотите, чтобы ваша строка была допустимой строкой javascript, которую вы можете использовать внутри своего кода javascript (в вашем примере — передать строку selected_comp функции), вы должны:

  1. Убедитесь, что в вашей строке нет разрывов строк.
  2. Убедитесь, что в вашей строке нет кавычек (обратите внимание, здесь это зависит от кавычек, которые вы используете в своем коде — одинарные / двойные).

Таким образом, вы можете:

  1. str_replace(["r", "n"], ['r', 'n'], $comp_row['comments']);
  2. str_replace("'", "\'", $comp_row['comments']);

И в вашем коде:

 <button onclick="selected_comp('". 
    str_replace("'", "\'",
        str_replace(["r", "n"], ['r', 'n'], $comp_row['comments'])
    ) .
"')"
  

Я использовал ' , потому что вы использовали ее в своей исходной функции.