Как удалить все не буквенно-цифровые символы из текстовой области и вернуть строку слов, разделенных одинарными пробелами

Я пытаюсь взять текст, который пользователи вводят в текстовое поле, и сравнить его с файлом пользовательского словаря. В качестве первого шага я хотел бы проанализировать ввод и удалить не буквенно-цифровые символы (которые, вероятно, будут содержать знаки препинания) и лишние пробелы/символы новой строки, и в итоге получить строку слов, разделенных одиночными пробелами.

Например, начните с

The child said, 
"Bye"!

И в конечном итоге с

The child said Bye

Я пробовал следующее, но всякий раз, когда появляется новая строка, она заменяет символ новой строки буквой «n» в переменной comment_stripped. Как я могу заставить его возвращать comment_stripped в виде слов, разделенных пробелами, без добавления символов «n»?

jQuery(document).ready(function($){
  var comment_raw = '';
  var comment_stripped = '';
  $("#comment").on("input", function(){
        comment_raw = ($(this).val());
        comment_stripped = JSON.stringify(comment_raw).replace(/[^\w\s]|_/g, "").replace(/\n/g, " ").replace(/\s+/g, " ");
        console.info('comment raw = '+comment_raw);
        console.info('comment stripped = '+comment_stripped);
  });
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id = "comment" name = "comment" cols = "45" rows = "8" maxlength = "65525" required = "required" autocomplete = "off" autocorrect = "off" autocapitalize = "none" spellcheck = "false"></textarea>

Почему вы звоните JSON.stringify на строку?

user5734311 20.12.2020 20:45

@ChrisG о, я видел это в каком-то примере. возможно, это не нужно

Mike Eng 20.12.2020 20:48

Это единственная вещь, которая ломает ваш код :) Он превращает объекты в текст JSON.

user5734311 20.12.2020 20:56
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
0
3
124
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

JSON.stringify не требуется. Попробуй это

jQuery(document).ready(function($) {
  var comment_raw = '';
  var comment_stripped = '';
  $("#comment").on("input", function() {
    comment_raw = ($(this).val());
    comment_stripped = comment_raw.replace(/[^\w\s]|_/g, "").replace(/\n/g, " ").replace(/\s+/g, " ");
    console.info('comment raw = ' + comment_raw);
    console.info('comment stripped = ' + comment_stripped);
  });
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id = "comment" name = "comment" cols = "45" rows = "8" maxlength = "65525" required = "required" autocomplete = "off" autocorrect = "off" autocapitalize = "none" spellcheck = "false"></textarea>

«n», которое вы получаете, является следствием использования JSON.stringify. Вы не должны называть это.

Также:

  • Вам не нужен отдельный replace для "\n"
  • Вы должны иметь дело со случаем, когда между словами нет пробела, а есть только другие не буквенно-цифровые символы. Ваш код склеит эти слова вместе. Поэтому замените последовательность не буквенно-цифровых символов пробелом.
  • Обрежьте результат, чтобы избавиться от потенциального пробела в начале или конце.
  • Рекомендуется использовать аргумент обратного вызова функции jQuery вместо ready.
  • Вы можете определить свои переменные во внутренней области видимости. Они не имеют никакой пользы вне его.

jQuery(function($) {
  $("button").on("click", function() {
    var comment_raw = $("#comment").val();
    $("#comment").val(
      comment_raw.replace(/([^\w\s]|_)+/g, " ")
                 .replace(/\s+/g, " ")
                 .trim()
    );
  });
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id = "comment" name = "comment" cols = "45" rows = "8" maxlength = "65525" required = "required" autocomplete = "off" autocorrect = "off" autocapitalize = "none" spellcheck = "false"></textarea>
<button>clean</button>

И это выглядит немного проще, если вы используете match вместо replace:

jQuery(function($) {
  $("button").on("click", function() {
    var comment_raw = $("#comment").val();
    $("#comment").val(
      (comment_raw.match(/[a-z0-9]+/gi) || []).join(" ")
    );
  });
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id = "comment" name = "comment" cols = "45" rows = "8" maxlength = "65525" required = "required" autocomplete = "off" autocorrect = "off" autocapitalize = "none" spellcheck = "false"></textarea>
<button>clean</button>

Другие вопросы по теме