Hola, esta clase sirve para reemplazar palabras por otras que llamaré "sinónimos". Cada palabra admite un numero indeterminado de sinonimos.
Si una
palabra se proporciona sin un sinonimo entonces se considera como "censurada" y se reemplaza por un numero igual de asteriscos '*'
ok... pero por que tanto lio si puedo usar str_replace ? pues bien, porque buscamos palabras y no simplemente substrings, asi que una de las casas que se chequean es que esten delimitadas por espacios, comas, esten entre parentesis (), corchetes [], etc. Sino fuera asi.. podria intentando reemplazar "mente" por "pensamiento", tambien reemplazar "momentaneamente", "torpemente", etc.
Por medio del metodo filter() se pueden directamente filtrar todas las palabras del array que se pasa como parametro.
Se puede especificar que queremos evitar TAGS HTML o XML y sus atributos de modo que no se modifiquen por error, por ejemplo, las ulrs de los links. Para esto se hace uso de la clase
HTML editor. Por defecto se ignoran los tags pero para desactivar esta caracteristica tenemos el metodo avoidTagsOFF()
Los metodos basicos serian:
Cita: ->setSearch('palabra'); // seteo palabra a reemplazar
->setOneReplacement('sinonimo'); // agrego un 'sinonimo' mas
->filter(array('censurada1','censurada2',...'censur adaN')); // lista negra
->replace($str); // aplica los reemplazos y filtros sobre una cadena
Tambien se pueden hacer reemplazos combinando setSearch() para las palabras que me interesa sean reemplazadas con setReplacements() que recibe un array asociativo donde para cada palabra ('search') hay una lista (array) de de sinonimos.
Código PHP:
<?
Include "html_editor.class.php";
class replacer {
// Replacer class for PHP rev 1.00
// Pablo Bozzolo (2009)
private $avoidTags=TRUE;
private $wordDict; // diccionario de 'palabras'
private $phraseDict; // diccionario de 'frases'
private $search;
private $replacement;
function avoidTagsOFF(){
$this->avoidTags=False;
}
function setSubject ($subject){
$this->subject = $subject;
}
function setSearch ($search){
$this->search = $search;
}
function setReplacements ($replacement){
$this->wordDict = $replacement;
}
function setOneReplacement ($replacement){ // antes setReplacementOnebyOne()
$this->wordDict[$this->search][]=$replacement;
}
private function take_one($arreglo){
return($arreglo[array_rand($arreglo)]);
}
private function buildSentenceDict(){
foreach ($this->wordDict as $search => $replacement){
if (strstr($search,' ')){
$this->phraseDict[$search] = $this->wordDict[$search];
unset ($this->wordDict[$search]);
}
}
//print_r ($this->phraseDict);
return ($str);
}
private function replaceUsingphraseDict($str){
foreach ($this->phraseDict as $search => $replacement){
$str = str_replace ($search,$this->take_one($replacement),$str);
}
return $str;
}
function replace ($str){ // metodo que da inicio a los reemplazos
$this->setSubject($str);
$this->buildSentenceDict(); // creo un diccionario de frases usando el de palabras
if ($this->avoidTags==FALSE){
$str = $this->replaceUsingphraseDict($str); // proceso busquedas de frases
return preg_replace_callback("|[ \[.,;(-]{0,}([\wáéíóúñÑ]+)[ \].,;)-]{0,}|is",array($this, "callback"),$str); // aisla palabras con delimitadores
}else{
$html = new htmlEditor($this->subject);
$cant = $html->getNumberOfPieces();
for ($i=0;$i<$cant;$i++){
$sub_before = $html->getPieceN($i);
$sub_before = $this->replaceUsingphraseDict($sub_before); // proceso busquedas de frases
$sub_after = preg_replace_callback("|[ \[.,;(]{0,}([\wáéíóúñÑ]+)[ \].,;)]{0,}|is",array($this, "callback"),$sub_before);
$html->setPieceN ($sub_after,$i);
}
return $html->getHTML();
}
}
private function callback ($matches){ // recibe y envia a procesar palabras individuales
$delimitada = $matches[0]; // palabra embebida en delimitadores
$word = $matches[1];
// algoritmo de reemplazo ////////
$wordAfer = $this->word_replacer ($word);
if ($wordAfer=="") $wordAfer = $word;
////////////////////////////////////////////
return str_replace ($word,$wordAfer,$delimitada);
}
private function word_replacer ($str){
$out='';
if (array_key_exists($str,$this->wordDict)){
$out = $this->take_one ($this->wordDict[$str]);
if ($out==''){
$out =str_repeat('*',strlen($str)); // ****
}
}
return ($out);
}
function filter (array $words){ // recibe array de palabras a filtrar
foreach ($words as $word){
$this->wordDict[$word]=array();
}
}
} # fin de clase
?>