<div class = "filterW">
<p class = "lineMsgAlign">
<?php echo $rowSelectMsg['comment']; ?>
</p>
</div>
产生错误的字词过滤器代码:
//select all bad wordfilter
$querySelectWordFilter = "SELECT * FROM badwordfilter";
$stmtSelectWordFilter = $conn->prepare($querySelectWordFilter);
$stmtSelectWordFilter->execute();
while($rowSelectWordFilter = $stmtSelectWordFilter->fetch()){
$Array[] = $rowSelectWordFilter["filterWord"];
}
//filter word part
var filter = <?php echo json_encode($Array); ?>;
String.prototype.repeat = function(num){
return new Array(num + 1).join(this);
}
$('.filterW').text(function(i, txt){
// Check all words in array
for(var i=0; i<filter.length; i++){
var pattern = new RegExp('\\b' + filter[i] + '\\b', 'gi');
// Create a new string filled with '*'
var replacement = '*'.repeat(filter[i].length);
txt = txt.replace(pattern, replacement);
}
return txt;
});
问题:上面的代码工作正常,问题是它也会过滤我的HTML代码。但是,我不想过滤HTML代码。我该如何防止这种情况?
例如(这是上述代码的结果):
Enter user: I am **tester** sohai
Result: I am tester *****
我想要的是结果是这样的:
Enter user: I am **tester** sohai
Result: I am **tester** *****
我怎样才能做到这一点?
答案 0 :(得分:1)
使用text()
方法,而不是使用jQuery html()
方法。 text()
方法从元素主体中删除所有HTML标记,而html()
方法返回整个内容,包括标记。
此代码是javascript的更新版本,它实现了单词过滤机制:
//filter word part
var filter = <?php echo json_encode($Array); ?>;
String.prototype.repeat = function(num) {
return new Array(num + 1).join(this);
}
$('.filterW').html(function(i, html) {
// Check all words in array
for (var i=0; i<filter.length; i++) {
var pattern = new RegExp('\\b' + filter[i] + '\\b', 'gi');
// Create a new string filled with '*'
var replacement = '*'.repeat(filter[i].length);
html = html.replace(pattern, replacement);
}
return html;
});
这应该适用于您的目的,但此实现至少有2个问题。第一个是如果单词过滤器包含出现在标记中的单词,HTML标记将会生效。例如,请考虑以下示例:
<a href="#" id="igloo">Igloo</a>
如果您选择过滤&#39; igloo&#39;,则链接的body和id属性都会受到影响。根据您的需要,这可能是可以接受的。如果这是不可接受的,则需要完整的HTML解析器来解决问题。
第二个问题是不会识别按标记划分的单词。考虑这个例子:
<p>This is an exa<i>m</i>ple</p>
在这种情况下,搜索&#39;示例&#39;使用text()
方法时会成功,但使用html()
方法时则不会。可以说,嵌入在一个单词中的标记表明该单词实际上并不是一个单词,但是,这是垃圾邮件发送者历来用来绕过垃圾邮件检测软件的方法之一。