我有正则表达式的这个问题,它对我来说真的没有友好的语法:(。
基本上我需要匹配一些文本并将匹配的单词/字母用<strong>
包装。
html = html.replace(new RegExp('(' + word + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>';
现在一切正常,但在某些情况下,先前添加的<strong>
匹配以搞乱html。
所以我基本上需要html.replace
函数在匹配过程中忽略任何<strong>
个字。
我尝试使用new RegExp('(' + word + ')'
更改new RegExp('(?!\<strong\>)(' + word + ')'
,但我仍有问题。
实施例
'<strong>Alpinestars</strong> SMX Plus Gore-Tex Boots'.replace(new RegExp('(o)(?!</strong>)', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>';});
返回
"<str<strong>o</strong>ng>Alpinestars</str<strong>o</strong>ng> SMX Plus G<strong>o</strong>re-Tex B<strong>o</strong><strong>o</strong>ts"
答案 0 :(得分:1)
你很亲密。你的订单错了。根据以下mdn页面,x(?!y)
表示:仅当x未跟随y时匹配x。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
所以,这似乎对我有用:
var word = 'and';
'dogs <strong>and</strong> cats <strong>and</strong>'.replace(
new RegExp('(' + word + ')(?!</strong>)', 'ig'),
function ($1, match) {
return '<strong>' + match + '</strong>';
}
);
答案 1 :(得分:1)
您可以检查您是否在(?![^>]*>)
前瞻的元素节点内:
function escapeRegExp(string){
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
var key = 'o';
var s = '<strong>Alpinestars</strong> SMX Plus Gore-Tex Boots';
var res = s.replace(RegExp(escapeRegExp(key) + '(?![^>]*>)', 'ig'), function (m) {
return '<strong>' + m + '</strong>';});
document.getElementById("t").innerHTML = res.replace(/>/g, ">").replace(/</g, "<");
&#13;
<div id="t"/>
&#13;
您也不需要任何捕获组(除非您正在使用boots|caps|hats
之类的替换)并且不必将new
与RegExp
一起使用。我还添加了一个escapeRegExp
function from MDN来转义key
中的特殊字符(如果有的话)。