从查询中更新禁止的单词字符串以匹配

Updating banned word string from query to match

我正在尝试按设定的时间间隔从数据库中查询单词并将它们与 Twitter API 进行匹配,我不知道如何获取变量

var bannedName = rows[0].name;

到这个表达式中,现在只是放置 bannedName 变量会导致无法识别

if(!tweetTextRetweet.match(/^RT|@TopU3DAssets|@LatestAssetBot|@IndieLeverage|@Parodossy|@GameArtSleuth|@Alex_TNT/)) 

结果像

if(!tweetTextRetweet.match(bannedName))

为了让它工作并与单词匹配。如果我将查询放在 interval 之外它不会更新查询,而在数据库

中更改时保留结果不变

这是我目前拥有的

setInterval(function() {

    con.query("SELECT setting,name FROM droid_settings WHERE ID = 2", function(error,rows){ 
        var bannedName = rows[0].name;
        console.log('INFO ------- ',bannedName);

    });

    for (var i = 0; i < tweets.length; i++) {
        var tweetTextRetweet = tweets[i].text; 

        if (!tweetTextRetweet.match(/^RT|@TopU3DAssets|@LatestAssetBot|@IndieLeverage|@Parodossy|@GameArtSleuth|@Alex_TNT/)) { // search for RT and @
            console.log('INFO -------',tweets[i].id);
            dateTime(); 
            console.log('INFO -------',tweets[i].text);


            tweets.length = 0;
        }else{
            //console.log('SKIPPED');
            //dateTime(); 
        }

    }
    // reset the tweets array
    tweets.length = 0;
},  4 * 1000);

一种直接的方法是在 if 语句中添加第二个条件:

if (tweetTextRetweet.indexOf(bannedName) !== -1 && !tweetTextRetweet.match(/^RT|@TopU3DAssets|@LatestAssetBot|@IndieLeverage|@Parodossy|@GameArtSleuth|@Alex_TNT/)) {

您也可以将 bannedName 放入正则表达式中,但是您必须使用正则表达式构造函数从字符串构造正则表达式才能这样做,并且必须确保 bannedName 不包含任何特殊的正则表达式匹配未正确转义的字符(这就是我在上面使用 .indexOf() 的原因,因为它对 bannedName 中的正则表达式字符不敏感,因此不必转义名称。

假设 bannedName 不包含任何特殊的正则表达式字符,正则表达式可以像这样动态构建:

var regex = new RegExp(bannedName + "|^RT|@TopU3DAssets|@LatestAssetBot|@IndieLeverage|@Parodossy|@GameArtSleuth|@Alex_TNT");
if (!regex.test(tweetTextRetweet)) {

如果您需要转义 bannedName 中可能的正则表达式字符,您可以使用此答案中的函数来执行此操作:Is there a RegExp.escape function in Javascript?.


也许我首先误解了你的问题。如果您想使用查询中的 bannedName,则只需将其余代码放在 bannedName 可用的函数中即可。

setInterval(function() {

    con.query("SELECT setting,name FROM droid_settings WHERE ID = 2", function(error,rows){ 
        var bannedName = rows[0].name;
        console.log('INFO ------- ',bannedName);

        for (var i = 0; i < tweets.length; i++) {
            var tweetTextRetweet = tweets[i].text; 

            if (tweetTextRetweet.indexOf(bannedName) === -1 && !tweetTextRetweet.match(/^RT|@TopU3DAssets|@LatestAssetBot|@IndieLeverage|@Parodossy|@GameArtSleuth|@Alex_TNT/)) { // search for RT and @
                console.log('INFO -------',tweets[i].id);
                dateTime(); 
                console.log('INFO -------',tweets[i].text);


                tweets.length = 0;
            }else{
                //console.log('SKIPPED');
                //dateTime(); 
            }

        }
        // reset the tweets array
        tweets.length = 0;
    });

},  4 * 1000);