You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

textarea正则匹配替换与Ajax重复调用问题求助

解决方案:替换匹配文本 + 避免重复AJAX请求

我来帮你搞定这两个问题——把匹配到的文本替换为AJAX返回的内容,同时避免每次按键都触发不必要的请求。先看修正后的完整代码:

// 存储上一次匹配的内容,用来避免重复请求
let lastMatchedReferences = null;

$('#notes').keyup(function() {
  const $textarea = $(this);
  const myValue = $textarea.val();
  // 修正正则:匹配两个减号之间的文本(排除减号本身)
  const regex = /\-([^-]+)\-/gmi;
  const currentMatches = myValue.match(regex);

  // 只有当有匹配,且匹配内容和上一次不同时,才发起请求
  if (currentMatches && JSON.stringify(currentMatches) !== JSON.stringify(lastMatchedReferences)) {
    // 更新上一次匹配的内容,避免重复请求
    lastMatchedReferences = [...currentMatches];

    $.ajax({
      type: "POST",
      url: "scripts/script.php",
      data: { "reference": currentMatches },
      success: function(data) {
        // 假设script.php返回的是与匹配项对应的替换数组,比如["苹果定义", "香蕉定义"]
        let updatedValue = myValue;
        currentMatches.forEach((match, index) => {
          // 把每个匹配的"-xxx-"替换为对应的返回内容
          updatedValue = updatedValue.replace(match, data[index]);
        });
        // 更新textarea的值
        $textarea.val(updatedValue);
        // 替换完成后重置,下次可以重新匹配新的内容
        lastMatchedReferences = null;
      },
      error: function() {
        // 请求失败时重置,避免一直阻塞后续请求
        lastMatchedReferences = null;
      }
    });
  }
});

关键修改点说明:

  • 修正正则表达式:原正则里的[^\)]是排除右括号,这和你“匹配两个减号之间文本”的需求不符,改成[^-]后,会正确匹配两个-之间的所有非减号字符。
  • 避免重复请求:新增lastMatchedReferences变量存储上一次的匹配结果,只有当本次匹配内容和上一次不同时,才发起AJAX请求。用JSON.stringify比较数组内容,确保完全一致时不重复请求。
  • 移除同步AJAX:删掉了async: false,同步请求会阻塞浏览器,导致用户输入卡顿。异步请求更符合现代前端的交互逻辑。
  • 正确替换文本:在success回调里,遍历所有匹配项,逐个将-xxx-替换为返回的对应内容,最后更新textarea的值。替换完成后重置lastMatchedReferences,这样后续输入新的-xxx-时可以重新触发请求。
  • 错误处理:添加error回调重置匹配记录,避免请求失败后一直无法发起新请求。

额外提示:

如果你的scripts/script.php返回的不是数组,而是处理后的完整文本(比如直接返回替换后的整个textarea内容),那success回调里可以简化为直接设置$textarea.val(data)即可,不需要遍历替换。

内容的提问来源于stack exchange,提问作者Escudo Bravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:43:47