Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于匹配整词的Javascript正则表达式_Javascript_Regex - Fatal编程技术网

用于匹配整词的Javascript正则表达式

用于匹配整词的Javascript正则表达式,javascript,regex,Javascript,Regex,这是我们的后续问题 由于javascript正则表达式与.net正则表达式(我已经习惯了)有很大不同,所以我似乎不知道如何增强这个正则表达式 以下是当前的模式: var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g'); 当短语独立时,这种方法非常有效,但如果它位于锚标记中,则该方法最终会删除整个锚(这是不可取的) 范例 <body> This is my text. It's an ass of a time in

这是我们的后续问题

由于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>

这是我的文本。这是课堂上最无聊的时刻

这里的问题是因为您将\b任一侧的匹配作为一个单词。这意味着它需要被某些字符包围,而“>”不是其中之一


因此,在您的代码中,您需要更改正则表达式,以允许'>'存在于左侧,并且可能''+'filter[i]+'(\b|无法使用正则表达式来删除您声称已删除的内容。问题是输入内容与您声称的内容不同。如果您添加

alert(txt);
对于您的函数,您将看到您实际上正在传递

This is my text. It's an ass of a time in class ass-hole
这是正文的文本。也许你想要它的内部HTML

下次,请先发布一个最小的、可运行的问题演示。如果你说你在进行替换时遇到问题,而代码没有执行任何替换,那就太糟糕了。

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

听起来你真的想在正文的子代文本节点上循环。我不熟悉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;
}
函数allTextNodes(父节点){
函数getChildNodes(父节点){
var x,out=[];
对于(x=0;x
使用该函数(或类似函数),请尝试以下用法:

(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);
            }
        }
    }
}());
(函数(){
变量x,i,re,rep,
节点=所有文本节点(document.body),
过滤器=['some','words','go','here'];
对于(x=0;x

如果你有一个过滤词,它包含一个在正则表达式中有意义的字符,那么在这种情况下似乎不太可能,但是你应该考虑它。

不可能使用正则表达式来移除你所声称的它。为自己测试。我不是问它是个好主意。我不是搜索。g作为一个意见,我只是在寻找一个可能的正则表达式解决方案。我明白,我只是认为我应该把它放在一边,如果你想测试你的JavaScript正则表达式,我已经为此编写了一个工具:绝对是这样。
()。text
已经去掉了html标记。下面是更新的fiddle-“值得思考的是:如果你有一个过滤词,其中包含一个在正则表达式中有意义的字符,那会发生什么?”你能详细说明一种可能的情况吗?我只是过滤掉整个页面上的脏话。你的解决方案似乎工作得很好。