首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果前者是后者的一部分,那么如何安全地将每个搜索替换为一个替换项,而不需要再次替换这样的搜索?

如果前者是后者的一部分,那么如何安全地将每个搜索替换为一个替换项,而不需要再次替换这样的搜索?
EN

Stack Overflow用户
提问于 2022-07-05 10:23:43
回答 3查看 132关注 0票数 2
代码语言:javascript
复制
var string = "Please click on dashboard and then open the dashboard details to verify your details on the data";
var stringArray = ["dashboard" , "dashboard" , "data"]
var replaceArray = ["https://abcd.com/login" , "https://abcd.com/home" , "https://abcd.com/data"]
for(i=0;i<stringArray.length; i++){
    string = string.replace(stringArray[i].trim(), "<a href='"+replaceArray[i].trim()+"'>"+stringArray[i].trim()+"</a>");
}

我有一个字符串和上面的两个数组。我需要用两个数组中提到的相应的锚链接标记替换我的字符串。stringArray定义了要链接的单词,replaceArray定义了应该添加的URL。和第一次出现的仪表板一样,应该将仪表板锚定为"https://abcd.com/login“,第二次出现的”仪表板“应替换为"https://abcd.com/home”,而“数据”应替换为"https://abcd.com/data"“。

我试图找出字符串中的单词,并使用replace/replaceAll替换它,对于单个出现的单词可以很好地工作,但是对于多次出现,它是不工作的。

任何人都能帮我解决这个问题。

结果:

代码语言:javascript
复制
"Please click on <a href='https://abcd.com/login'><a href='https://abcd.com/home'>dashboard</a></a> and then open the dashboard details to verify your details on the <a href='https://abcd.com/data'>data</a>"

预期输出:

代码语言:javascript
复制
"Please click on <a href='https://abcd.com/login'>dashboard</a> and then open the <a href='https://abcd.com/home'>dashboard</a> details to verify your details on the <a href='https://abcd.com/data'>data</a>"
EN

回答 3

Stack Overflow用户

发布于 2022-07-05 14:42:37

这里有一个使用regex和查找的解决方案:

代码语言:javascript
复制
const text = "Please click on dashboard and then open the dashboard details to verify your details on the data or the other data";
const tokens = ["dashboard", "dashboard", "data", "data"]
const links = ["https://abcd.com/login", "https://abcd.com/home", "https://abcd.com/data", "https://abcd.com/dashboard/data"]

var result = text;

for (i = 0; i < tokens.length; i++) {
  const re = new RegExp('(?<=.*)((?<= )' + tokens[i] + '(?= |$))(?=.*)');
  result = result.replace(re, '<a href="' + links[i] + '">$&</a>'); //TODO array length validation
}

console.log(result)

此正则表达式只适用于被空格包围的令牌,以避免替换URL中的文本。

您可以看到更多关于这里的展望和查找,以及关于浏览器兼容性的这里

票数 1
EN

Stack Overflow用户

发布于 2022-07-05 10:35:46

这个人怎么样,

代码语言:javascript
复制
var string = "Please click on dashboard and then open the dashboard details to verify your details on the data";
const stringArray = string.split(' ');
var targetTexts = ["dashboard" , "dashboard" , "data"]
var replaceTexts = ["https://abcd.com/login" , "https://abcd.com/home" , "https://abcd.com/data"]

const resultArray = []
for (let i = 0; i < stringArray.length; i++) {
  const word = stringArray[i];
  const targetTextIndex = targetTexts.indexOf(word);
  
  if (targetTextIndex > -1) {
    resultArray.push("<a href='"+replaceTexts[targetTextIndex]+"'>"+word+"</a>")
    targetTexts = targetTexts.filter((_el, idx) => idx !== targetTextIndex)
    replaceTexts = replaceTexts.filter((_el, idx) => idx !== targetTextIndex)

  } else {
    resultArray.push(word);
  }
}

console.log(resultArray.join(' '))

我希望你在这件事上有个提示。它的工作就像一个魅力,会有异常处理为您处理。

票数 0
EN

Stack Overflow用户

发布于 2022-07-05 13:52:44

提出的方法包括

  • 一个mapping任务,它首先将两个相关数组、搜索项列表和超文本引用列表合并到另一个替换项数组中。
  • 一个reduce任务,它处理替换项的列表,并且安全地(没有遇到相同的但已经被替换的搜索)用其相关的完整超文本表达式替换每个搜索。

第二部分是利用offset方法的replacerFunction参数来实现的。在offset值(当前匹配索引)上,可以编程地(同时减少)将原来提供的字符串值拆分为已处理的和未处理的子字符串/部分。reduce任务的数组结果使join恢复为最终完全替换的字符串值。

代码语言:javascript
复制
function createReplacementItemFromBoundHrefs(search, idx) {
  const hrefList = this;
  return {
    search,
    href: hrefList[idx],
  }
}
function aggregateSafelyReplacedHrefPartials(partials, { search, href }) {
  // intentionally mutates `partials`, an array of zero to many
  // processed substrings and always an unprocessed (last item)
  // `target` substring of the originally provided string value.
  const target = partials.pop();

  let sliceAt;
  const result = target
    .replace(

      // a case insensitive search regex.
      RegExp(`${ search }`, 'i'),

      // a replacer function which helps preventing multiple
      // manipulations of always the same search/replace term.
      (match, offset) => {
        const replacement = `<a href="${ href }">${ match }</a>`;

        sliceAt = offset + replacement.length;

        return replacement;
      },
    );

  return [
    ...partials,              // - processed lately.
    result.slice(0, sliceAt), // - processed latest.
    result.slice(sliceAt),    // - to be processed.
  ];
}

function safelyReplaceSearchWithRelatedHref(str, searchList, hrefList) {
  return searchList
    .map(createReplacementItemFromBoundHrefs, hrefList)
    .reduce(aggregateSafelyReplacedHrefPartials, [str])
    .join('');
}

const string = "Please click on dashboard and then open the dashboard details to verify your details on the data";

const stringArray = [
  "dashboard",
  "dashboard",
  "data",
];
const replaceArray = [
  "https://abcd.com/login",
  "https://abcd.com/home",
  "https://abcd.com/data",
];

console.log(
  'before ... ',
  string,
  '\n\nafter ... ',
  safelyReplaceSearchWithRelatedHref(string, stringArray, replaceArray),
);
console.log(
  stringArray
    .map(createReplacementItemFromBoundHrefs, replaceArray) 
);
代码语言:javascript
复制
.as-console-wrapper { min-height: 100%!important; top: 0; }

“我有另一个用例,我只想替换字符串中的特定出现词。从下面开始,应该替换仪表板和第二次出现的数据。您能帮我做这个吗?var string = 'On dashboard, then open dashboard details, verify your dashboard details on data and other data'; var wordsArray = ['dashboard', 'dashboard', 'data']; var occurrences = [1 , 3 , 2]; var linksArray = ['abcd.com/login', 'abcd.com/home', 'abcd.com/data'];__”- Siva_K22。

为此,上面提出的第一个解可以很容易地重构成一个新的,保持两个折叠的方法。

  • 第一项任务是创建一个替换跟踪器,使替换功能能够跟踪每个搜索的当前出现次数和替换。
  • 第二个任务是通过以下方式直接执行replace提供的原始字符串
代码语言:javascript
复制
- a case insensitive regex which features any possible word/search ... and ...
- a [replacer function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#parameters) which keeps track of each search's occurrence and upon a search's current occurrence count decides whether to really replace a search by its related full hypertext reference or just with itself (its very own match).

"@PeterSeliger --是的,但是我在RegEx下面解决了这个问题. string= string.replace(新的string=函数(X){返回x.replace(currentstring+“$”,replaceString)});- Siva_K22

同样,只使用regex的方法永远不会像真正跟踪搜索事件那样可靠(也不像可读的那样),实现时,这两个目标一方面是通用的,也是足够专门的(仅regex的方法在后面的术语中是有限得多的)。

代码语言:javascript
复制
function aggregateReplacementTrackerFromBoundData(collector, search, idx) {
  const { occurrences = [], hrefList = [], tracker = {} } = collector;

  // create and/or access and aggregate
  // a search specific occurrence tracker.
  (tracker[search.toLowerCase()] ??= {
    occurrence: {},
    occurrenceCount: 0,
  })
  .occurrence[ occurrences[idx] ] = hrefList[idx];

  return { occurrences, hrefList, tracker };
}
function safelyReplaceSearchOccurrencesWithRelatedHref(
  str, searchList, hrefList, occurrences,
) {
  // create an overall replacement tracker for any search.
  const { tracker } = searchList
    .reduce(aggregateReplacementTrackerFromBoundData, {
      occurrences,
      hrefList,
      tracker: {},
    });

  return str
    .replace(

      // a case insensitive regex which features any possible word/search.
      RegExp(`\\b(?:${ searchList.join('|') })\\b`, 'gi'),

      // a replacer function which keeps track of each search's occurrence
      // and upon a search's current occurrence count decides whether to
      // really replace a search by its related full hypertext reference
      // or just with itself (its very own match).
      (match/*, offset, target*/) => {
        const searchTracker = tracker[match.toLowerCase()];

        const count = ++searchTracker.occurrenceCount;
        const href = searchTracker.occurrence[count] ?? null;

        return (href !== null)
          && `<a href="${ href }">${ match }</a>`
          || match;
      },
    );
}

const string = "On dashboard, then open dashboard details, verify your dashboard details on data and other data";

const wordsArray = [
  "dashboard",
  "dashboard",
  "data",
];
const occurrences = [1 , 3 , 2];

const linksArray = [
  "https://abcd.com/login",
  "https://abcd.com/home",
  "https://abcd.com/data",
];

console.log(
  'before ... ',
  string,
  '\n\nafter ... ',
  safelyReplaceSearchOccurrencesWithRelatedHref(
    string, wordsArray, linksArray, occurrences,
  ),
);
console.log({
  replacementTracker: wordsArray
    .reduce(aggregateReplacementTrackerFromBoundData, {
      occurrences,
      hrefList: linksArray,
      tracker: {},
    })
    .tracker
});
代码语言:javascript
复制
.as-console-wrapper { min-height: 100%!important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72867805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档