JS экранирование символов перед отправкой

Ответить
ya
^-^
Сообщения: 2534
Зарегистрирован: 16 дек 2021, 19:56

JS экранирование символов перед отправкой

Сообщение ya »

Код: Выделить всё

// Получаем текст из переменной "вопрос"
var вопрос = getContactVariable("вопрос");

// Проверяем, есть ли текст в переменной "вопрос"
if (вопрос && typeof вопрос === "string" && вопрос.trim() !== "") {
  // Экранируем все специальные символы
  var экранированныйВопрос = вопрос
    .replace(/\\/g, '\\\\\\\\')   // Экранируем все обратные слэши
    .replace(/"/g, '\\"')         // Экранируем двойные кавычки
    .replace(/'/g, "\\'")         // Экранируем одиночные кавычки
    .replace(/\n/g, "\\n")        // Экранируем переносы строк
    .replace(/\t/g, "\\t")        // Экранируем табуляции
    .replace(/\s+/g, ' ')         // Заменяем все пробелы и переносы строк на один пробел
    // Удаляем управляющие символы (например, символы управления ASCII)
    .replace(/[\u0000-\u001F\u007F-\u009F]/g, "")
    // Обрабатываем суррогатные пары (эмодзи и другие символы за пределами BMP)
    .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, function(match) {
      // Возвращаем экранированную версию суррогатной пары
      var high = match.charCodeAt(0);
      var low = match.charCodeAt(1);
      // Формируем код точки Unicode
      var codePoint = ((high - 0xD800) << 10) + (low - 0xDC00) + 0x10000;
      return "\\u{" + codePoint.toString(16) + "}";
    });
  
  // Теперь переменная экранирована
  // Вы можете использовать ее далее по необходимости
  console.log(экранированныйВопрос);
}
ya
^-^
Сообщения: 2534
Зарегистрирован: 16 дек 2021, 19:56

Re: JS экранирование символов перед отправкой

Сообщение ya »

Код: Выделить всё

class МойОбъект {
  // Статическая переменная для хранения экземпляра
  static #instance = null;

  // Приватная переменная для хранения вопроса
  #вопрос = "";

  // Конструктор приватный (для предотвращения создания экземпляров вне класса)
  constructor() {
    if (МойОбъект.#instance) {
      return МойОбъект.#instance;
    }
    МойОбъект.#instance = this;
  }

  // Приватный метод для экранирования строки
  #экранироватьСтроку(входнаяСтрока) {
    if (!входнаяСтрока || typeof входнаяСтрока !== "string") {
      return "";
    }
    return входнаяСтрока
      .replace(/\\/g, '\\\\\\\\')   // Экранируем все обратные слэши
      .replace(/"/g, '\\"')         // Экранируем двойные кавычки
      .replace(/'/g, "\\'")         // Экранируем одиночные кавычки
      .replace(/\n/g, "\\n")        // Экранируем переносы строк
      .replace(/\t/g, "\\t")        // Экранируем табуляции
      .replace(/\s+/g, ' ')         // Заменяем все пробелы и переносы строк на один пробел
      .replace(/[\u0000-\u001F\u007F-\u009F]/g, "") // Убираем управляющие символы
      .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, function(match) {
        // Обрабатываем суррогатные пары (эмодзи и другие символы вне BMP)
        var high = match.charCodeAt(0);
        var low = match.charCodeAt(1);
        var codePoint = ((high - 0xD800) << 10) + (low - 0xDC00) + 0x10000;
        return "\\u{" + codePoint.toString(16) + "}";
      });
  }

  // Геттер для вопроса
  get вопрос() {
    return this.#вопрос;
  }

  // Сеттер для вопроса с автоматическим экранированием
  set вопрос(значение) {
    if (typeof значение === "string") {
      this.#вопрос = this.#экранироватьСтроку(значение);
    } else {
      this.#вопрос = "";
    }
  }

  // Статический метод для получения экземпляра
  static getInstance() {
    if (!МойОбъект.#instance) {
      МойОбъект.#instance = new МойОбъект();
    }
    return МойОбъект.#instance;
  }
}

// Использование
const singleton = МойОбъект.getInstance();
singleton.вопрос = getContactVariable("вопрос"); // Установка с автоматическим экранированием
console.log(singleton.вопрос); // Получение экранированного вопроса
Объяснение:

#экранироватьСтроку — приватный метод класса.
вопрос — приватная переменная с геттером и сеттером.
getInstance() — статический метод для получения единственного экземпляра класса (шаблон одиночка).
В сеттере происходит автоматическое экранирование строки при присвоении.
Ответить