我目前正在寻找一种将匹配文本转换为粗体 html 行的方法。除了特殊字符之外,它部分工作,这给我带来了问题,因为我希望保留原始字符串,但不比较原始字符串。
示例:
给定原始字符串:
Taco John's is my favorite place to eat.
并且想要匹配:
is my 'favorite'
要获得所需的结果:
Taco John's <b>is my favorite</b> place to eat.
我目前解决匹配字符串中多余引号的方法是替换它们
let regex = new RegExp('('+escapeRegexCharacters(matching_text.replace(/[^a-z 0-9]/gi,''))+')',"gi")
let html= full_text.replace(/[^a-z 0-9]/gi,'').replace(regex, "<b>$1</b>")}}></span>
这几乎有效,只是我失去了所有标点符号:
Taco Johns <b>is my favorite</b> place to eat
有没有办法使用正则表达式或其他方法在匹配短语周围添加标签,同时在匹配过程中忽略大小写和特殊字符?
更新#1:
看来我说的不清楚了。我需要原始字符串的标点符号保留在最终结果的 html 中。我需要匹配的文本逻辑来忽略所有特殊字符和大写。因此,is my favorite
is My favorite
和 is my 'favorite'
都应该触发匹配。
最佳答案
您可以在正则表达式中在每个要匹配的字符之间注入(inject)一个模式,该模式将跳过可能出现的任何特殊字符,而不是从正在搜索的字符串中删除特殊字符。这样,您就可以构建一个可以直接应用于正在搜索的字符串的正则表达式,并且替换操作将不会触及匹配项之外的特殊字符:
let escapeRegexCharacters =
s => s.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"),
full_text = "Taco John's is My favorite place to eat.";
matching_text = "is my 'favorite'";
regex = new RegExp(matching_text.replace(/[^a-z\s\d]/gi, '')
.split().map(escapeRegexCharacters).join('[^a-z\s\d]*'), "gi"),
html = full_text.replace(regex, "<b>$&</b>");
console.log(html);
关于javascript - 匹配并替换子字符串,同时忽略特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41270733/