Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/07/2009, 17:08
Avatar de Italico76
Italico76
 
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Sonrisa Clase para intercambiar por sinonimos, censurar palabras [aporte]

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 
 
?>
__________________
Salu2!

Última edición por Italico76; 21/07/2009 a las 14:39