- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了这个函数,旨在用给定一组标记
的指定表达式expr
替换text
文档中的单词或短语要匹配。该文档采用换行格式。
function replaceTokens(text, tokens, expr, isline = false) {
tokens.forEach(word => {
if (expr[token]) {
if (isline) { // line regex
text = text.replace(new RegExp("(" + word.replace(/([\(\)'?*!"])/g, "\\$1") + ")", "gi"), expr);
} else {
text = text.replace(new RegExp("(" + word + ")", "gi"), expr[token]);
}
}
});
return text;
}
我面临两个问题。
1) 对于 words 标记,例如 Lorem
、qui
等,它工作得很好,但我无法摆脱整个标记例如,我不想在像 quis
这样的词中匹配 qui
,而是只匹配文本中给定的标记。使用 ^word$
不适用于捕获组 ^(word)$
[1 - 已解决] 根据第一个答案 new RegExp("\\b("+ word + ")\\b", "gi")
2) 对于 phrases 标记,我使用的正则表达式无法正常工作。我想匹配像 Lorem ipsum dolor sit amet
in
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet etwas
它应该只匹配第一行,而不是第二行。
这是一个例子。对于 (1),您可以看到 qui
是如何被捕获为标记并包含在单词 quis
或 aliquip
中的。
function replaceTokens(text, tokens, expr, isline = false) {
tokens.forEach(word => {
if (isline) { // line regex
text = text.replace(new RegExp("(" + word.replace(/([\(\)'?*!"])/g, "\\$1") + ")", "gi"), expr);
} else {
text = text.replace(new RegExp("\\b(" + word + ")\\b", "gi"), expr);
}
});
return text;
}
text = "Lorem ipsum dolor sit amet,\n consectetur adipiscing elit,\nsed do eiusmod tempor incididunt\nut labore et dolore magna aliqua.\nUt enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi\nut aliquip ex ea commodo consequat.\nDuis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident,\nLorem ipsum dolor sit amet etwas,\nsunt in culpa qui officia deserunt mollit anim id est laborum"
out = replaceTokens(text, ["Lorem", "ut", "qui"], "<strong>$1</strong>", false)
out_phrases = replaceTokens(text, ["Lorem ipsum dolor sit amet", "Duis aute irure dolor in reprehenderit"], "<strong>$1</strong>", true)
document.getElementById("in_text").innerHTML = text.replace(/\n/g, '<br/>')
document.getElementById("out_text").innerHTML = out.replace(/\n/g, '<br/>')
document.getElementById("out_phrases").innerHTML = out_phrases.replace(/\n/g, '<br/>')
<div id="in_text"></div>
<hr>
<div id="out_text"></div>
<hr>
<div id="out_phrases"></div>
已添加 jsfiddle尝试一下。
最佳答案
第一个问题看起来很清楚,将你的 Regex 字符串包装在 '\b
'(单词边界)中:
text = text.replace(new RegExp("\\b(" + word + ")\\b", "gi"), expr);
这应该匹配 'Whole Words only'。
第二个问题,在这里你可以检查,如果它是文本的开头,或者它跟在一个点之后,或者是文本的结尾,或者它后面的一个点,就像这样:
text = text.replace(new RegExp("(^|\\.\\s?|,\\s?)(" + word.replace(/([\(\)'?*!"])/g, "\\$1") + ")($|\\.|,)", "gi"), expr);
想法是它应该匹配SENTENCE
,而不是line
。一个句子要么从字符串的开头开始,要么在点或逗号之后开始,然后以点、逗号或字符串的结尾结束。
您不应使用“多行”选项。
编辑2:
我已经将我创建的组更改为非捕获组,因此它们不会将组替换网格化。现在是:
text = text.replace(new RegExp("(?:^|\\.\\s?)(" + word.replace(/([\(\)'?*!"])/g, "\\$1") + ")(?:\\.|,|$)", "gi"), expr);
现在它适用于 fiddle .
关于javascript - 如何在 JavaScript 中为给定表达式替换文本中的短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52840641/
我是一名优秀的程序员,十分优秀!