Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/07/2009, 17:26
Avatar de Italico76
Italico76
 
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 9 meses
Puntos: 292
Exclamación preg_replace_callback() en una clase

Amigos: estoy haciendo una clase de reemplazo de palabras y tengo un problema con preg_replace_callback(), ya que me dice que "requiere una funcion callback valida" y me temo sea un problema de pasaje de argumentos.

Cita:
Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, '', to be a valid callback in C:\xampp\htdocs\parser\clases\str_replace.class.ph p on line 45
Código PHP:
<?
class replacer {

  private 
$subject
  private 
$insideTags=TRUE;
  private 
$dictiorary;
  private 
$asterix=FALSE;
  
  private 
$search;      
  private 
$replacement;

  function 
setSubject ($subject){
    
$this->subject $subject;   
  }  

  function 
setSearch ($search){
    
$this->search $search;
  }
  
  function 
setReplacements (array $replacement){ // voy a usar esta
    
$this->dictiorary[$this->search]=$replacement;
  }
  
  function 
setReplacement ($replacement){ 
    
$this->dictiorary[$this->search][]=$replacement;
  }
    
  function 
setAsterix(){
    
$this->asterix=TRUE;
  }  
    
  private function 
take_one($arreglo){ 
    return(
$arreglo[array_rand($arreglo)]);
  }

  function 
replace ($str){  // metodo que da inicio a los reemplazos  
  
    
$str strtolower($str); 
    
$this->setSubject($str);   

    
// ordeno el diccionario
    
sort($this->dictiorary); 
    
$this->dictiorary array_reverse ($this->dictiorary);
    
    return 
preg_replace_callback("|[ \[.,;(]{0,}([\wáéíóúñÑ]+)[ \].,;)]{0,}|is","{$this->callback}",$str); // aisla palabras con delimitadores varios
  
}    

  private function 
callback ($matches){  // recibe y envia a procesar palabras individuales
 
    
$delimitada $matches[0];
    
$word $matches[1];
   
    
// algoritmo de reemplazo           ////////
    
$wordAfer word_replacer ($word);  
    if (
$wordAfer==""$wordAfer $word;
    
////////////////////////////////////////////
  
    
return str_replace ($word,$wordAfer,$delimitada);
  }
  
  private function 
word_replacer ($str){  
   
   
// si no hubiera reemplazo, reemplazo por ****
     
    
$out='';      
    if (
array_key_exists($str,$this->dictiorary)){
      
$out =  take_one ($this->dictiorary[$str]);        
    }
    
    if (
$this->asterix){
      
$out=str_repeat('*',strlen($str));
    }  
    return (
$out);     
  }    
    
   
# fin de clase

   
//  $a = array_merge($more,$a);  
 
?>
y la uso asi:

Código PHP:
<?php
 
Include "str_replace.class.php";

 
$str "El mundo de los problemas";

 
$todo   file_get_contents ("../reemplazos.txt");
 
$lineas   preg_split("/[\r\n]+/",$todo); //  lineas
 
 
$reemplazo = new replacer();
 
$reemplazo->setAsterix();
 
 foreach (
$lineas as $linea){      
   
$words = (explode (',',$linea));
   
$a $words[0];   // palabra a buscar
 
   
$reemplazo->setSearch($a);
 
   
$reemplazos = array();
   for (
$i=1;$i<count($words);$i++){
     
$array_reemplazos[]= $words[$i]; // reemplazos
   
}     
   
   
$reemplazo->setReplacement$array_reemplazos);
    
 }     
    
   echo 
$reemplazo->replace($str);
  
 
?>
y un ejemplo de reeemplazos.txt seria:

Cita:
mundo,planeta
problemas,dificultades,dolores de cabeza
La linea problematica es la que dice:

Código PHP:
return preg_replace_callback("|[ \[.,;(]{0,}([\wáéíóúñÑ]+)[ \].,;)]{0,}|is","{$this->callback}",$str); 
A ver si me ayudan

[ GRACIAS ]
__________________
Salu2!