用于匹配整词的Javascript正则表达式
这是我们的后续问题 由于javascript正则表达式与.net正则表达式(我已经习惯了)有很大不同,所以我似乎不知道如何增强这个正则表达式 以下是当前的模式:用于匹配整词的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
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-“值得思考的是:如果你有一个过滤词,其中包含一个在正则表达式中有意义的字符,那会发生什么?”你能详细说明一种可能的情况吗?我只是过滤掉整个页面上的脏话。你的解决方案似乎工作得很好。