Js替换和正则表达式排除一个单词

时间:2015-11-18 07:30:58

标签: javascript regex

我有正则表达式的这个问题,它对我来说真的没有友好的语法:(。

基本上我需要匹配一些文本并将匹配的单词/字母用<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"

2 个答案:

答案 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)

您可以检查您是否在(?![^>]*>)前瞻的元素节点内:

&#13;
&#13;
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, "&gt;").replace(/</g, "&lt;");
&#13;
<div id="t"/>
&#13;
&#13;
&#13;

您也不需要任何捕获组(除非您正在使用boots|caps|hats之类的替换)并且不必将newRegExp一起使用。我还添加了一个escapeRegExp function from MDN来转义key中的特殊字符(如果有的话)。