Sam San
Sam San

Reputation: 6903

str_replace when matched and followed by space or special characters

I have a working function that strips profanity words.

The word list is compose of 1700 bad words.

My problem is that it censored

'badwords '

but not

'badwords.' , 'badwords' and the like.

If I chose to remove space after

$badword[$key] = $word;

instead of

$badword[$key] = $word." ";

then I would have a bigger problem because if the bad word is CON then it will stripped a word CONSTANT

My question is, how can i strip a WORD followed by special characters except space?

badword. badword# badword,

.

function badWordFilter($data)
{
    $wordlist = file_get_contents("badwordsnew.txt");
    $words = explode(",", $wordlist);


    $badword = array();
    $replacementword = array();


    foreach ($words as $key => $word) 
    {
       $badword[$key] = $word." ";
       $replacementword[$key] = addStars($word);
    }


    return str_ireplace($badword,$replacementword,$data);
}


function addStars($word) 
{
    $length = strlen($word);

    return "*" . substr($word, 1, 1) . str_repeat("*", $length - 2)." " ;
}

Upvotes: 1

Views: 184

Answers (2)

Sam San
Sam San

Reputation: 6903

I was able to answer my own question with the help of @maxchehab answer, but I can't declared his answer because it has fault at some area. I am posting this answer so others can use this code when they need a BAD WORD FILTER.

function badWordFinder($data)
{
    $data = " " . $data . " ";  //adding white space at the beginning and end of $data will help stripped bad words located at the begging and/or end.        

    $badwordlist = "bad,words,here,comma separated,no space before and after the word(s),multiple word is allowed"; //file_get_contents("badwordsnew.txt"); //
    $badwords = explode(",", $badwordlist);

    $capturedBadwords = array();


    foreach ($badwords as $bad) 
    {
        if(stripos($data, $bad))
        {
            array_push($capturedBadwords, $bad);
        }             
    }

    return badWordFilter($data, $capturedBadwords);
}


function badWordFilter($data, array $capturedBadwords)
{

    $specialCharacters = ["!","@","#","$","%","^","&","*","(",")","_","+",".",","," "];

    foreach ($specialCharacters as $endingAt) 
    {
      foreach ($capturedBadwords as $bad) 
      {
          $data = str_ireplace($bad.$endingAt, addStars($bad), $data);   
      }                  
    }

    return trim($data);
}  


function addStars($bad) 
{
    $length = strlen($bad);

    return "*" . substr($bad, 1, 1) . str_repeat("*", $length - 2)." ";
}


$str = 'i am bad words but i cant post it here because it is not allowed by the website some bad words# here with bad. ending in specia character but my code is badly strong so i can captured and striped those bad words.';



echo "$str<br><br>";

echo badWordFinder($str);

Upvotes: 0

user4119200
user4119200

Reputation:

Assuming that $data is a text that needs to be censored, badWordFilter() will return the text with bad words as *.

function badWordFilter($data)
{
    $wordlist = file_get_contents("badwordsnew.txt");



    $words = explode(",", $wordlist);

    $specialCharacters = ["!","@","#","$","%","^","&","*","(",")","_","+",".",",",""];

    $dataList = explode(" ", $data);

    $output = "";

    foreach ($dataList as $check) 
    {
        $temp = $check;
        $doesContain = contains($check, $words);
        if($doesContain != false){
            foreach($specialCharacters as $character){
                if($check == $doesContain . $character || $check == $character . $doesContain ){
                    $temp = addStars($doesContain);
                }
            }
        }

        $output .= $temp . " ";
    }


    return $output;
}

function contains($str, array $arr)
{
    foreach($arr as $a) {
        if (stripos($str,$a) !== false) return $a;
    }
    return false;
}


function addStars($word) 
{
    $length = strlen($word);

    return "*" . substr($word, 1, 1) . str_repeat("*", $length - 2)." " ;
}

Sandbox

Upvotes: 2

Related Questions