如何在自动替换脚本的textarea中使用直引号和智能引号?

问题描述

我真的对如何正确地组合这些行以将直引号自动替换为文本区域中的智能引号感到困惑。

它工作得更早了,但是在我添加了一行来固定光标替换字符后将光标移到末尾。

这是当前的样子:

    var area = document.getElementById("textarea1");

    var getCount = function (str,search) {
        return str.split(search).length - 1;
    };

    var replaceText = function (search,replaceWith) {
        if (area.value.indexOf(search) >= 0) {
            var start = area.selectionStart;
            var end = area.selectionEnd;
            var textBefore = area.value.substr(0,end);
            var lengthDiff = (replaceWith.length - search.length) * getCount(textBefore,search);
            area.value = area.value.replace(search,replaceWith);
            area.selectionStart = start + lengthDiff;
            area.selectionEnd = end + lengthDiff;
        }
    };

    area.addEventListener("keypress",function (e) {
        setTimeout(function () {
            replaceText(",",")
            replaceText(" ;",";")
            replaceText(" .",".")
            replaceText("  "," ")
            replaceText("--","—")
            replaceText(/(^|[-\u2014\s(\["])'/g,"$1\u2018")
            replaceText(/'/g,"\u2019")
            replaceText(/(^|[-\u2014/\[(\u2018\s])"/g,"$1\u201c")
            replaceText(/"/g,"\u201d");
        },0)
    });
<textarea id="textarea1" cols="40" rows="8"></textarea>

逗号,分号,句号,破折号和双精度空格已经可以使用了,但是不能用引号引起来。我该怎么做才能更正这些正则表达式行?

这正是我被困的地方:

replaceText(/(^|[-\u2014\s(\["])'/g,"$1\u2018")
replaceText(/'/g,"\u2019")
replaceText(/(^|[-\u2014/\[(\u2018\s])"/g,"$1\u201c")
replaceText(/"/g,"\u201d");

预先感谢

解决方法

在您的 replaceText 中,您需要区分何时传递正则表达式或字符串。 .indexOf()不接受正则表达式。

此外,我建议使用input来更改按键事件。

摘要:

window.addEventListener('DOMContentLoaded',function(e) {
  var area = document.getElementById("textarea1");

  var getCount = function (str,search) {
      return str.split(search).length - 1;
  };

  var replaceText = function (search,replaceWith) {
      if (typeof(search) == "object") {
          area.value = area.value.replace(search,replaceWith);
          return;
      }
      if (area.value.indexOf(search) >= 0) {
          var start = area.selectionStart;
          var end = area.selectionEnd;
          var textBefore = area.value.substr(0,end);
          var lengthDiff = (replaceWith.length - search.length) * getCount(textBefore,search);
          area.value = area.value.replace(search,replaceWith);
          area.selectionStart = start + lengthDiff;
          area.selectionEnd = end + lengthDiff;
      }
  };

  area.addEventListener("input",function (e) {
      replaceText(",",");
      replaceText(" ;",";");
      replaceText(" .",".");
      replaceText("  "," ");
      replaceText("--","—");
      replaceText(/(^|[-\u2014\s(\["])'/g,"$1\u2018");
      replaceText(/'/g,"\u2019");
      replaceText(/(^|[-\u2014/\[(\u2018\s])"/g,"$1\u201c");
      replaceText(/"/g,"\u201d");
  });
});
<textarea id="textarea1" cols="40" rows="8"></textarea>