使用javascript

时间:2016-05-05 16:28:54

标签: javascript php

<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** *****

我怎样才能做到这一点?

1 个答案:

答案 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()方法时则不会。可以说,嵌入在一个单词中的标记表明该单词实际上并不是一个单词,但是,这是垃圾邮件发送者历来用来绕过垃圾邮件检测软件的方法之一。