【问题标题】:Php check if string contains multiple wordsphp检查字符串是否包含多个单词
【发布时间】:2012-05-09 14:41:38
【问题描述】:

我已经在互联网上四处寻找可以做到这一点的东西,但它只适用于一个词。

我正在尝试构建一个脚本来检测我网站的错误用户名,如果用户名包含数组中的任何单词,则会检测到错误的用户名。

这是我编写的代码,但无法运行。

$bad_words = array("yo","hi");
$sentence = "yo";

if (strpos($bad_words,$sentence)==false) {
echo "success";
}

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 如果有人的名字是“Youngs”怎么办?
  • 不要使用 == 因为 (0 == false) 会返回 true。如果函数返回多种类型,请使用严格 (===, !==)
  • 这将变成一个坏词过滤器。
  • @frank 用户名可以包含空格或其他非字母数字字符吗?您是否担心过滤器中没有出现“yö”之类的字符串?

标签: php string preg-match words


【解决方案1】:

使用

substr_count

对于数组使用以下函数

function substr_count_array( $haystack, $needle ) {
     $count = 0;
     foreach ($needle as $substring) {
          $count += substr_count( $haystack, $substring);
     }
     return $count;
}

【讨论】:

  • 为什么?有一个功能:str_word_count
  • @MarceloRodovalho str_word_count 与操作员的要求无关。 str_word_count 返回字符串中的单词数。 substr_count 返回在字符串中找到单词 ($needle) 的次数。我的函数 substr_count_array 使用 $needle(s) 数组做同样的事情
【解决方案2】:

您可以使用此代码:

$bad_words = array("yo","hi");
$sentence = "yo you your";
// break your sentence into words first
preg_match_all('/\w+/', $sentence, $m);
echo ( array_diff ( $m[0], $bad_words ) === $m[0] ) ? "no bad words found\n" :
                                                      "bad words found\n";

【讨论】:

    【解决方案3】:
    // returns false or true
    function multiStringTester($feed , $arrayTest)
    {   
        $validator = false;
        for ($i = 0; $i < count($arrayTest); $i++) 
        {
                if (stringTester($feed, $arrayTest[$i]) === false ) 
                {   
                    continue;
                } else 
                {
                    $validator = true;              
                }       
        }
        return $validator;
    }
    //www.ffdigital.net
    

    【讨论】:

    • 函数 stringTester() 未找到?
    • function stringTester($feed, $strTest) { $processedFeed = normalize($feed); $processedTest = normalize($strTest); $pos = strpos($processedFeed, $processedTest); if ($pos === false) { //=== false //echo "WORD ".$strTest." NOT FOUND &lt;br /&gt;"; return false; } else { //print_r($licitaToFilter); //echo "WORD " . $strTest . " FOUND IN &lt;br /&gt;"; //echo " IS ON LINE ".$pos; return true; } }
    • function normalize ($string){ $trans = array('&amp;agrave;'=&gt;'a', '&amp;aacute;'=&gt;'a', '&amp;acirc;'=&gt;'a', '&amp;atilde;'=&gt;'a', '&amp;auml;'=&gt;'a', '&amp;aelig;'=&gt;'a', '&amp;ccedil;'=&gt;'c', '&amp;egrave;'=&gt;'e', '&amp;eacute;'=&gt;'e', '&amp;ecirc;'=&gt;'e', '&amp;euml;'=&gt;'e', '&amp;igrave;'=&gt;'i', '&amp;iacute;'=&gt;'i', '&amp;iuml;'=&gt;'i', '&amp;ograve;'=&gt;'o', '&amp;oacute;'=&gt;'o', '&amp;ocirc;'=&gt;'o', '&amp;otilde;'=&gt;'o', '&amp;ouml; '=&gt;'o','&amp;ugrave;'=&gt;'u', '&amp;uacute;'=&gt;'u', '&amp;uuml;'=&gt;'u'); $processedString1 = strtolower($string); return (strtr($processedString1, $trans )); }
    【解决方案4】:

    我相信一个句子不止一个单词

    试试

    $badwords = array("yo","hi");
    $string  = "i am yo this is testing";
    $word = array_intersect( $badwords,explode(" " , $string));
    if(empty($word))
    {
        echo "Sucess" ;
    }
    

    【讨论】:

      【解决方案5】:
      <?php
      function isUserNameCorrect()
      {
          Foreach($badname in $badnames)
          {
              if(strstr($badname, $enteredname) == false)
              {
                   return false;
              }
          }
          return true;
      }
      

      也许这有帮助

      【讨论】:

      • 解决方案不适用于以下问题:如果用户键入“ifooyou!”,则不会检测到坏词“傻瓜” (您还需要考虑部分匹配。
      【解决方案6】:

      很遗憾,您不能直接为函数 strpos/strstr 提供 Array

      根据 PHP.net cmets,要做到这一点,您需要使用(或根据需要创建自己的)函数,如下所示:

      function strstr_array($haystack, $needle) 
      {
           if ( !is_array( $haystack ) ) {
               return false;
           }
           foreach ( $haystack as $element ) {
               if ( stristr( $element, $needle ) ) {
                   return $element;
               }
           }
      }
      

      然后,只需将strpos 更改为新功能-strstr_array

      $bad_words = array("yo","hi");
      $sentence = "yo";
      
      if (strstr_array($bad_words,$sentence)==false) {
           echo "success";
      }
      

      【讨论】:

        【解决方案7】:

        我会按如下方式实现:

        $bad_words = array("yo","hi");
        $sentence = "yo";
        
        $valid = true;
        foreach ($bad_words as $bad_word) {
            if (strpos($sentence, $bad_word) !== false) {
                $valid = false;
                break;
            }
        }
        
        if ($valid) {
            echo "success";
        }
        

        一个句子是有效的,除非它包含至少一个来自$bad_words 的单词。注意严格检查(即!==),没有这个检查将在strpos的结果为0而不是false时失败。

        【讨论】:

          【解决方案8】:

          你已经接近了。您可以通过以下方式进行:

          $bad_words = array("yo","hi");
          $sentence = "yo";
          $match = false;
          foreach($bad_words as $bad_word) {
            if (strpos($bad_word,$sentence) === false) {  # use $bad_word, not $bad_words
              $match = true;
              break;
            }
          }
          if($match) { echo "success"; }
          

          【讨论】:

          • 不应该是 if (strpos($bad_word,$sentence) !== false) { $match = true;休息; }
          猜你喜欢
          • 1970-01-01
          • 2014-01-25
          • 1970-01-01
          • 1970-01-01
          • 2015-06-24
          • 2013-12-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多