PHP检查字符串是否包含多个单词

3

我在网上找了很多东西,但都只能处理一个单词。

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

这是我写的代码,但没有成功。

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

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

如果有人能帮我,我会非常感激。

1
可能是重复问题:http://stackoverflow.com/q/1916261/259457 - Travesty3
如果有人的名字是“Youngs”,该怎么办? - Sampson
1
不要使用 ==,因为 (0 == false) 会返回 true。如果一个函数返回多个类型,请使用严格模式(===,!==)。 - Cole Tobin
@frank 用户名可以包含空格或其他非字母数字字符吗?您是否担心像“yö”这样的字符串不会出现在您的过滤器中? - Sampson
@Frank 如果有人把自己的名字取为“pr0n”,那会不会好一些?我不确定你所描述的问题是否能通过过滤器解决。 - Sampson
显示剩余2条评论
8个回答

7

使用 substr_count 函数。

如果要对数组进行操作,请使用以下函数。

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

为什么?有一个函数可以做到这一点:str_word_count - Marcelo Rodovalho
@MarceloRodovalho,str_word_count与op所问的无关。str_word_count返回字符串中单词的数量。substr_count返回字符串中单词($needle)出现的次数。而我的函数substr_count_array使用$needle(s)数组执行相同的操作。 - Oliver M Grech

1
您可以使用这个代码:
$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";

1
// 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()? - Oliver M Grech
function stringTester($feed, $strTest) { $processedFeed = normalize($feed); $processedTest = normalize($strTest); $pos = strpos($processedFeed, $processedTest); if ($pos === false) { //=== false //echo "WORD ".$strTest." NOT FOUND <br />"; return false; } else { //print_r($licitaToFilter); //echo "WORD " . $strTest . " FOUND IN <br />"; //echo " IS ON LINE ".$pos; return true; } } - ffdigital
function normalize ($string){ $trans = array('&agrave;'=>'a', '&aacute;'=>'a', '&acirc;'=>'a', '&atilde;'=>'a', '&auml;'=>'a', '&aelig;'=>'a', '&ccedil;'=>'c', '&egrave;'=>'e', '&eacute;'=>'e', '&ecirc;'=>'e', '&euml;'=>'e', '&igrave;'=>'i', '&iacute;'=>'i', '&iuml;'=>'i', '&ograve;'=>'o', '&oacute;'=>'o', '&ocirc;'=>'o', '&otilde;'=>'o', '&ouml; '=>'o','&ugrave;'=>'u', '&uacute;'=>'u', '&uuml;'=>'u'); $processedString1 = strtolower($string); return (strtr($processedString1, $trans )); } - ffdigital

0

你很接近了。你可以按照以下方式操作:

$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; break; } 吗?
- Liam

0
<?php
function isUserNameCorrect()
{
    Foreach($badname in $badnames)
    {
        if(strstr($badname, $enteredname) == false)
        {
             return false;
        }
    }
    return true;
}

或许这可以帮助你


以下解决方案不适用于以下问题:如果用户输入“ifoolyou!”,则无法检测到不良词“fool”(您需要考虑部分匹配)。 - Charles Forest

0

我相信一句话不仅仅是一个单词

试试看

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

0

很遗憾,你不能直接将Array传递给函数strpos/strstr。

根据PHP.net的评论,要实现这个功能,你需要使用(或创建自己的函数)像这样的函数:

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";
}

0
我会按照以下方式实现:
$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时,检查将失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接