Hmmm, I'll give it another go with that list shortly.
Side note: I looked at the list, you've got a lot of entries that could be removed to save time during processing;
For instance if I have moth listed as a curse word, I don't need to list moths or mother, because both contain the word "moth" - if moth isn't found, it win't find moths or mother either 
Just doing what I can bit by bit. I'll see if I can't figure out what's broken soon as I get back.
Edit:
Pardon the doublepost, I fixed the issue.
The problem is actually list.txt - it's got newlines at the end of the words.
Code:
<?php
$explicit = file("list.txt"); //swear words, made x10 safe! :)
$badchars=array(
"\r",
"\n");
echo '<pre>';
print_r($explicit);
echo '</pre>';
$lyrics="my both mississippi."; //obviously change this so it gets the lyrics for you :)
$isexplicit=false;
foreach ($explicit as $checkme) {
$pos=strpos($lyrics,str_replace($badchars,"",$checkme));
if ($pos!==FALSE) { $isexplicit=true;}
}
if ($isexplicit==true)
{
echo "Explicit.";
}
else {
echo "not";
}
?>
In short it's doing one last modification on $checkme - it's replacing all characters matching the list in $badchars with "blankspace," AKA absolutely zip, zero, nada 
I should point out that it's possible to use the same str_replace like this:
Code:
$lyrics=str_replace(str_replace($badchars,"",$explicit),"*censored*",$lyrics);
Least this way it'll still display but it'll family-friendly it first 
Up to you either way, the second way's a heck of a lot shorter though. Would boil down to this:
Code:
<?php
$explicit = file("list.txt"); //swear words, made x10 safe! :)
$badchars=array(
"\r",
"\n");
echo '<pre>';
print_r($explicit);
echo '</pre>';
$lyrics="my both mississippi."; //obviously change this so it gets the lyrics for you :)
$lyrics=str_replace(str_replace($badchars,"",$explicit),"*censored*",$lyrics);
echo $lyrics;
echo '</pre>';
?>
Kinda does the same thing, but at least this way if the lyrics are explicit, it censors it all first.