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替换它,对于单个出现的单词可以很好地工作,但是对于多次出现,它是不工作的。
任何人都能帮我解决这个问题。
结果:
"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>"预期输出:
"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>"发布于 2022-07-05 14:42:37
这里有一个使用regex和查找的解决方案:
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中的文本。
发布于 2022-07-05 10:35:46
这个人怎么样,
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(' '))我希望你在这件事上有个提示。它的工作就像一个魅力,会有异常处理为您处理。
发布于 2022-07-05 13:52:44
提出的方法包括
mapping任务,它首先将两个相关数组、搜索项列表和超文本引用列表合并到另一个替换项数组中。reduce任务,它处理替换项的列表,并且安全地(没有遇到相同的但已经被替换的搜索)用其相关的完整超文本表达式替换每个搜索。第二部分是利用offset方法的replacerFunction参数来实现的。在offset值(当前匹配索引)上,可以编程地(同时减少)将原来提供的字符串值拆分为已处理的和未处理的子字符串/部分。reduce任务的数组结果使join恢复为最终完全替换的字符串值。
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)
);.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提供的原始字符串- 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的方法在后面的术语中是有限得多的)。
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
});.as-console-wrapper { min-height: 100%!important; top: 0; }
https://stackoverflow.com/questions/72867805
复制相似问题