title image


Smiley preg_replace() - patterns nur ganze Worte....
Hallo,



ich hab da gerade so eine klasse Klasse gefunden, die ich gerne als Bad-Word Filter einsetzen würde.

Nur würde ich mich beim Filtern gerne auf ganze Worte beschränken und nicht auch auf die eingebetteten Wortteile...



Beispiel: Bad_Word = 'arsch'

Filtersatz: 'die truppen waren im anmarsch, als...'



...dort sollte der Filter nicht zensieren!



kann mir jemand verraten, was ich mit den patterns in der Klasse anstellen muß, damit nur noch nach ganzen Worten gesucht wird?



cooper



anbei das ungekürzte Script:




class BadwordFilter {

var $_badwords = array();

var $_replacement = "*";

var $_result = array();



function BadwordFilter($badwords = null, $replacement = null) {

$flag = true;



if(!is_null($badwords)) $flag = $this->setBadwords($badwords);

if(!is_null($replacement)) $flag = $this->setReplacement($replacement);



return $flag;

}



function setBadwords($badwords) {

if(!is_array($badwords)) return false;



$this->_badwords = $badwords;

}



function getBadwords() {

return $this->_badwords;

}



function addBadwords($badwords) {

if(is_array($badwords)) {

$this->_badwords = array_merge($this->_badwords, $badwords);

return true;

}

elseif(is_string($badwords)) {

$this->_badwords[] = $badwords;

return true;

}

else {

return false;

}

}



function setReplacement($replacement) {

if(!is_string($replacement)) return false;



$this->_replacement = $replacement;

}



function getReplacement() {

return $this->_replacement;

}



function filter($text) {

if(!is_array($this->_badwords) || count($this->_badwords) < 1) return false;



if(!$this->containsBadword($text)) return false;



foreach($this->_badwords as $badword) {

$pattern = $this->_buildPattern($badword) . "e";

$text = preg_replace($pattern, "str_repeat('$this->_replacement' ,strlen('$badword'))", $text);

}



return $text;

}



function containsBadword($text) {

if(!is_array($this->_badwords) || count($this->_badwords) < 1) return false;

$this->_result = array();

$flag = false;



foreach($this->_badwords as $badword) {

if(preg_match($this->_buildPattern($badword), $text, $matches)) {

$flag = true;

$this->_result[] = $badword;

}

}



return $flag;

}



function getMatches() {

if(!is_array($this->_result) || count($this->_result) < 1) return false;



return $this->_result;

}



function _buildPattern($string) {

$chars = preg_split("//", strtolower($string));

array_pop($chars);

array_shift($chars);



foreach($chars as $key => $char) {

switch ($char) {

case "a":

$chars[$key] = "(a|\@|\/\\\)";

break;

case "b":

$chars[$key] = "(b|8)";

break;

case "i":

$chars[$key] = "(i|1|\||l)";

break;

case "l":

$chars[$key] = "(l|1|\||i)";

break;

case "v":

$chars[$key] = "(v|\\\/)";

break;

case "w":

$chars[$key] = "(w|\\\/\\\/)";

break;

}

}



$glue = "[\s\W]*";



return "~" . implode($glue, $chars) . "~ims";

}

}



# demotext

$str =<<
Das ist ein langer Text der Worte enthält wie z.B. T e s t oder t.e-st.





\/|@gr/\!!!!!

wiagra....

EOF;





# anwendung

$badwords = array("test", "viagra", "wiagra"); # diese worte sind 'böse' worte

$filter = new BadwordFilter($badwords);



# nur nach 'bösen' worten suchen, aber nicht zensieren

echo $filter->containsBadword($str)?"Der Text enthält 'böse' Worte!":"Der Text ist sauber!";



# den text 'zensieren'

echo nl2br($filter->filter($str));



# welche worte wurden überhaupt gefunden?

echo "Matches: ". implode(", ", $filter->getMatches()) . "";

?>



... see you at
Strategie Browsergame my-Dynastie

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: