Javascript正则表达式匹配整个单词

时间:2011-04-26 16:55:42

标签: javascript regex

这是this one

的后续问题

由于javascript正则表达式与.net正则表达式(我习惯)有很大不同,我似乎无法弄清楚如何增强这个正则表达式。

这是目前的模式:

var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g');

当短语单独存在但是如果它位于锚标记中时,这种方法很有效,该方法最终会移除整个锚点(这是不可取的)。

实施例

<body>
    This is my text. It's an ass of a time in class
    <a href="http://example.com/1234/ass-hole">ass-hole</a>
</body>

显示为

<body> This is my text. It's an *** of a time in class ***-hole </body>
DOM中的

我希望它看起来像

<body>
    This is my text. It's an *** of a time in class
    <a href="http://example.com/1234/***-hole">***-hole</a>
</body>

3 个答案:

答案 0 :(得分:3)

看起来$('body').text(function (i, txt) { ... });在一个大块中为您提供了body元素的内部文本,并且已经删除了所有标记。换句话说,您的正则表达式不会删除标记,但$('body').text是。

听起来你真的想要循环身体的后代子文本节点。我不熟悉jQuery,也许它有另一个功能为你做这个,但如果没有,你可以使用这个:

function allTextNodes(parent) {

    function getChildNodes(parent) {
        var x, out = [];
        for (x = 0; x < parent.childNodes.length; x += 1) {
            out[x] = parent.childNodes[x];
        }

        return out;
    }

    var cursor, closed = [], open = getChildNodes(parent);

    while (open.length) {
        cursor = open.shift();
        if (cursor.nodeType === 1) {
            open.unshift.apply(open, getChildNodes(cursor));
        }
        if (cursor.nodeType === 3) {
            closed.push(cursor);
        }
    }

    return closed;
}

使用该功能(或类似功能),请尝试使用此功能:

(function () {
    var x, i, re, rep,
        nodes = allTextNodes(document.body),
        filter = [ 'some', 'words', 'go', 'here' ];

    for (x = 0; x < nodes.length; x += 1) {
        for (i = 0; i < filter.length; i += 1) {
            re = new RegExp('\\b' + filter[i] + '\\b', 'g');
            rep = '****'; // fix this
            if (re.test(nodes[x].nodeValue)) {
                nodes[x].nodeValue = nodes[x].nodeValue.replace(re, rep);
            }
        }
    }
}());

思考的食物:如果你的过滤词包含一个在正则表达式中有意义的字符,会发生什么?在这种情况下似乎不太可能,但你应该认为它都是一样的。

答案 1 :(得分:1)

Regex无法用于删除您声称删除的内容。问题是输入不是你声称的那样。如果你添加

alert(txt);

到你的功能,你会看到你实际上正在传递

This is my text. It's an ass of a time in class ass-hole

到它。这是正文的文本。也许你想要它的 innerHTML

下次,请预先发布最小的,可运行的问题演示。当你说你在替换时遇到问题并且代码没有执行任何替换时,这真的很糟糕。

答案 2 :(得分:0)

这里的问题是因为你在两边都匹配\ b作为一个单词。这意味着它必须被某些字符包围,并且'&gt;'不是其中之一。

因此,在您的代码中,您需要更改正则表达式以允许'&gt;'存在于左侧,可能是'&lt;'存在于右边。

var pattern = new RegExp('(\ b |&gt;)'+ filter [i] +'(\ b |&lt;)','g');

可能非常接近你需要的东西。

可在此处找到真正的javascript REGEXP:http://www.javascriptkit.com/javatutors/redev2.shtml