【问题标题】:Check if url contains blacklisted strings javascript检查 url 是否包含列入黑名单的字符串 javascript
【发布时间】:2021-02-28 21:01:19
【问题描述】:

如果我有一个这样的黑名单单词数组:

banLinks = ["hello.com","test.net","this.com"];

我想检查我通过a.getAttribute("href") 获得的myLink 是否包含其中一个词,最好的方法是什么?现在我正在尝试这个,但它不起作用:

            for (let i = 0; i < banLinks.length; ++i) {
                if ( myLink.indexOf(banLinks[i]) <= -1 ){
                    urllink = myLink;
                }
            }

完整部分:

    var urllink;
    const banLinks = ["hello.com","test.net","this.com"];
    for (let j = 0; j < titlesArray.length; ++j) {
        if ( "some logic not important" ){

            for (let i = 0; i < banLinks.length; ++i) {
                if ( titlesArray[j].link.indexOf(banLinks[i]) <= -1 ){
                    urllink = titlesArray[j].link;
                }
            }

        }
    };

【问题讨论】:

    标签: javascript arrays for-loop include indexof


    【解决方案1】:

    告别 indexOf() 并使用 ES7 .includes() 检查项目是否在数组中。

    我想检查 myLink 是否通过 a.getAttribute("href") 包含其中一个词最好的方法是什么?

    if ( banLinks.includes(myLink) ){
                        urllink = myLink;
                    }
    

    【讨论】:

    • 我尝试了包含但结果是一样的,逻辑也不会相反吗?在链接中搜索数组内的单词?或包含应该双向工作?我用你在这里写的逆逻辑再试一次,但我想我已经试过了
    【解决方案2】:

    您是否处于无法使用Array.prototype.findIndex 的情况? (即你必须支持 IE)

    如果没有:

    const banLinks = ["hello.com","test.net","this.com"];
    const is_banned = banLinks.findIndex(bl => myLink.indexOf(bl) > -1) > -1
    

    还有你编辑的例子:

    const banLinks = ["hello.com","test.net","this.com"];
    // is_banned is now a function that ingests a link.
    const is_banned = (myLink) => banLinks.findIndex(bl => myLink.indexOf(bl) > -1) > -1
    // Get first link from titlesArray that is not banned.
    const urllink = titlesArray.map(t => t.link).find(li => is_banned(li) == false)
    

    虽然这都是根据您提供的代码进行的猜测。您在 for 循环中尝试做什么还不是很清楚。如果要查找第一个有效(即未禁止)urllink,则应在找到后break。否则,titlesArray 其余部分中的后续有效 urllinks 将覆盖之前的有效urllinks。

    【讨论】:

    • 感谢您的回答,不,我不需要与 IE 兼容。同样在我的 for 循环中,我试图将链接保存在 urllink 变量中,前提是它(链接)不包含数组中存在的任何违禁词
    • @NathanBernard 那么我提供的代码应该可以工作。在我的最后一行中,titlesArray 会搜索任何有效链接。如果找到一个,那么这就是urllink 的值。如果没有找到,urllink 将是 undefined。如果您尝试使用for 循环“查找”某些内容,通常您会在找到它时想要break
    • 是的,事情对我来说确实没有意义,因为我错过了休息时间;那是罪魁祸首,现在我基本上可以使用循环和布尔值来实现它,因为我发现我还需要检查是否达到了所有结果并接受错误的网址以防万一,以避免出现空链接。无论如何,我会将其标记为我最初问题的解决方案,它看起来也很简单
    【解决方案3】:

    你可以试试这个。请看一下

    const banLinks = ["hello.com","test.net","this.com"];
    var bannedUrlTest = new URL("http://www.hellotest.net");
    var safeUrlTest = new URL("http://www.google.net");
    
    var safeUrl = null;
    var bannedUrlArray = banLinks.filter((link)=>{
      return bannedUrlTest.href.includes(link)  
    })
    
    if(bannedUrlArray.length < 1){
      safeUrl = bannedUrlTest.href;
    } else {
      console.log('contains banned links')
    }
    
    var safeUrlArray = banLinks.filter((link)=>{
      return safeUrlTest.href.includes(link)  
    })
    
    if(safeUrlArray.length < 1){
      safeUrl = safeUrlTest.href;
      console.log('safeUrl', safeUrl);
    }

    【讨论】:

      【解决方案4】:
      <html>
        <body>
          <ul class="links">
            <li>
              <a href="hello.com">hello</a>
            </li>
            <li>
              <a href="steve.tech">steve</a>
            </li>
            <li>
              <a href="this.net">this</a>
            </li>
            <li>
              <a href="Nathan.net">Nathan</a>
            </li>
          </ul>   
        </body>
        <script>
            var links=[...document.querySelectorAll(".links a")]; //all links
            const BlackListLinks = ["hello.com","test.net","this.com"]; //BlackListLinks
            const goodLinks=[]; //stores the links don't in BlackListLinks
            for (let i = 0; i < links.length; i++) {  //iterate over all links
              const link = links[i].getAttribute("href"); //get the current link
              if (!BlackListLinks.includes(link)){ //test if the current link don't exist in BlackListLinks
                goodLinks.push(link); //add link to the goodLinks 
              }
          }
            console.log(goodLinks);//["steve.tech", "this.net", "Nathan.net"]
        </script>
      </html>
      

      【讨论】:

      • 如果您搜索链接是否在数组中,如果链接中除了正确的数组元素字符串之外的任何其他内容(例如“www.hello.com”),它将失败
      猜你喜欢
      • 2012-03-28
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2012-08-02
      • 2023-03-27
      相关资源
      最近更新 更多