Foros del Web » Programando para Internet » PHP »

reemplazar varias cadenas en un texto

Estas en el tema de reemplazar varias cadenas en un texto en el foro de PHP en Foros del Web. hola: tengo que reemplazar ciertos "tag" que hay en un texto que traigo de una base de datos, yo habia armado algo asi: Código PHP: ...
  #1 (permalink)  
Antiguo 25/06/2008, 17:44
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
reemplazar varias cadenas en un texto

hola:
tengo que reemplazar ciertos "tag" que hay en un texto que traigo de una base de datos, yo habia armado algo asi:
Código PHP:
/*el texto es :"Contrato entre #cliente# y #talento# para el evento #evento#<br>
               En el cual #talento# se compromete con #cliente# a participar del evento #evento#";*/
        
$original=$row["contrato"];
    
$cliente="Wallmart";
    
$talento="Lucas Sastre";
    
$evento="Autos Antiguos";
    
    echo 
"original: $original<br><br>";
    
$par1=str_replace("#cliente#",$cliente,$original);
    echo 
"parte 1: $par1<br><br>";
    
$par2=str_replace("#talento#",$talento,$par1);
    echo 
"parte 2: $par2<br><br>";
    
$contrato=str_replace("#evento#",$evento,$par2);
    echo 
"contrato final: $contrato<br>"
todo funciona excelente, pero el tema es que no voy tener que reeplazar 3 etiquetas distintas sino mas de 20 y repetir 20 veces el codigo me parece que no es optimo, alguien me puede indicar otra forma de hacerlo?

desde ya muchas gracias
  #2 (permalink)  
Antiguo 25/06/2008, 17:59
isra00
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: reemplazar varias cadenas en un texto

Debes usar una expresión regular, sustituyendo los # iniciales por $ y eliminando los # después de cada etiqueta. Si quieres pongo el código, pero creo que puedes ahorrártelo si cambias el sistema, y en vez de almacenar #variable# almacenas $variable en la BD, lo concatenas con "echo \"" y por último lo ejecutas como código PHP con eval(). Pillas?

Un saludo.
  #3 (permalink)  
Antiguo 25/06/2008, 18:21
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: reemplazar varias cadenas en un texto

isra00 creo que no se entendio bien, yo en la base de datos tengo contratos para que una persona los firme, pero estos contratos tienen que ser dinamicos es decir llenarse automaticamente con datos de la persona que hay en la db. Por eso el que crea el contrato usa "tags" para despues ser reemplazados por los datos correspondientes, por ejemplo yo creo el contrato para vos puedas firmarlo:
"Este contrato que se realiza entre #cliente# y #empleado# para trabajar en el evento #evento# el dia #fecha# en la tienda #tienda# en el local #local#"

Despues yo mediante una consulta sql extraigo los datos: cliente, empleado, evento, fecha, tienda, local. y los muestro cuando el empleado accede a su contrato, es decir en la base de datos siempre queda el texto con las etiquetas.

Espero que ahora se haya entendido mejor, sino poneme como vos decis a lo mejor lo entiendo yo mejor jajaja
salu2
  #4 (permalink)  
Antiguo 25/06/2008, 18:39
isra00
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: reemplazar varias cadenas en un texto

Pero esa información del cliente (empleado, evento, fecha, tienda, local...) se mantiene constante, o es variable? De todas maneras insisto en el tema de eval(), si tú creas variables como $empleado, $evento, etc a partir de la BD, puedes embeberlas en los strings (#empleado#) y después ejecutar los "echo" o "$a=..." con las nuevas variables.

De todos modos, dime la estructura de tablas de la BD, a ver si nos entendemos mejor ;)
  #5 (permalink)  
Antiguo 25/06/2008, 19:03
isra00
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: reemplazar varias cadenas en un texto

Prueba con esto:
Código PHP:
$textoContrato="El declarante #nombre# se compromete, a fecha de #fecha#, a resolver la duda en el foro";
$valores=array("nombre"=>"isra","fecha"=>"26/6/2008");
//$consulta=mysql_query("SELECT * FROM valores_contrato WHERE id=xx");
//$valores=mysql_fetch_assoc($consulta);
$partes=split("#",$textoContrato);
for (
$i=0;$i<count($partes);$i++) {
    if (
array_search($partes[$i],array_merge(array(null),array_keys($valores)))) {
        
$partes[$i]=$valores[$partes[$i]];
    }
}

$textoFinal=implode('',$partes);
echo 
$textoFinal
Me ha salido un poco enrevesado pero espero que lo entiendas (y que yo te haya entendido a ti). Se supone que tenemos un texto con las etiquetas, y los datos a sustituir los tenemos en un array asociativo (he comentado las líneas de acceso a BD como ejemplo, poniendo arriba los valores concretos). La función split parte la cadena donde se encuentran símbolos #, y después se recorren las partes comprobando que existe un elemento en el array de valores cuya clave corresponde con esa parte.

Al menos a mí me ha funcionado, ahora espero que sea eso lo que buscabas...
Me voy a dormir, que aquí son las 3:00am
Un abrazo.
  #6 (permalink)  
Antiguo 25/06/2008, 21:25
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: reemplazar varias cadenas en un texto

lo probare y mañana te cuento que onda muchisimas gracias
  #7 (permalink)  
Antiguo 27/06/2008, 21:19
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: reemplazar varias cadenas en un texto

isra00:
al final lo resolvi de esta manera:
Código PHP:
function first_pages(){
        include('functions.php');
        $date=get_date_today();
        if ($contrato==""){
        $contrato=$_POST[lstevt];
        }
        ?>
        <form action="?go=evt_contracts" method="post"><?php
        
//if ($_POST[lstevt]){
            //obtengo el contenido del contrato y lo divido en paginas
            
$sql="select content, event_id from client_contracts as cc 
                  join talents_contracts_signed as tcs on tcs.contract_id=cc.id
                  where cc.id=$contrato"
;
        
/*}
        else{
            $sql="select content, event_id from client_contracts as cc 
                  join talents_contracts_signed as tcs on tcs.contract_id=cc.id
                  where cc.id=$event";
        }*/
            
$result=mysql_query($sql);
            
$row=mysql_fetch_array($result);
            
//echo $sql;
            
$original=$row["content"];
            
$page=explode("#PAGE#",$row["content"]);
            
            
$id_event=$row["event_id"];
            
            
            
//obtengo todos los datos del talent
            
$sql="select first_name, concat(first_name,' ',last_name) as full_name from recruiters
                  where user_id=$_SESSION[iduser]"
;
            
$result=mysql_query($sql);
            
$talent=mysql_fetch_array($result);
            
            
//obtengo todos los datos del eventoa reemplazar
            
$sql="select e.id, e.description as event_name,event_program_code as epc, et.description as type,
                  c.company_name as client_name, c.website from events as e
                  join event_types as et on et.id=e.type_id
                  join clients as c on c.id=e.client_id
                  where e.id=$id_event"
;
            
//echo $sql."<br>";
            
$result=mysql_query($sql);
            
$event=mysql_fetch_array($result);
            
            
$patrones[0] = '/#TALENT-FULL-NAME#/';
            
$patrones[1] = '/#TALENT-FIRST-NAME#/';
            
$patrones[2] = '/#EVENT-NAME#/';
            
$patrones[3] = '/#AGENCY-NAME#/';
            
$patrones[4] = '/#EVENT-TYPE#/';
            
$patrones[5] = '/#EVENT-PROGRAM-CODE#/';
            
$reemplazos[0] = $talent["full_name"];
            
$reemplazos[1] = $talent["first_name"];
            
$reemplazos[2] = $event["event_name"];
            
$reemplazos[3] = $event["client_name"];
            
$reemplazos[4] = $event["type"];
            
$reemplazos[5] = $event["epc"];
            
            
//$i=0;
            
$count=count($page);
            echo 
$count;
                
            
?>
            
                <div style="background:#FFF none repeat scroll 0%;height:1000px;margin:20px 0pt 0pt 0px;
                      overflow:auto;position:relative;width:750px; border:1px solid; padding:10px;">
                    <?php echo preg_replace($patrones$reemplazos$page[0]);
                          
$i=$i+1;?>
                </div>
                <br/>
                <p>I <input type="text" name="signed" value=""> have read and completely understand the above stated event information.</p>
                <p>Date: <input type="text" name="date" value="<? echo $date;?>" readonly></p>
                <p><input type="submit" name="next" value="next page"></p>
                <input type="hidden" name="page" value="<? echo $i;?>">
                <input type="hidden" name="contrato" value="<? echo $contrato;?>">
                
            </form>
            <?php
            
//var_dump($page);
    
}//fin funcion first_page
El problema que tengo ahora es este, en el registro de la debe hay unos tags que son #locations# que deben mostrar todo lo referente a los datos de locations que puede ser 1 como n cantidad, como puedo hacer si son mas de uno para cambiar este tag por el contenido. Por ejemplo si tengo estos datos de locations que obtengo de la db:
nombre_location, direccion, telefono, estado, ciudad

y todo esos datos de por ejemplo 4 locations los tengo que poner donde encuentre el tag #locations#, alguna idea para guiarme....

desde ya muchas gracias
  #8 (permalink)  
Antiguo 01/07/2008, 12:17
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: reemplazar varias cadenas en un texto

bueno al final lo resolvi asi:

otengo los datos y los guardo en un array segun el dato
Código PHP:
//obtengo la positions, horarios y fechas del talento
            
$sql="select positions_title as positions, date, start_time, end_time from positions as p
                  join assigned_positions as ap on p.id_positions=ap.position_id 
                  where ap.talent_id=$talent[talent_id] and ap.event_id=$event[event_id]"
;
            
//var_dump($loca);
            
$result=mysql_query($sql);
            while (
$tes=mysql_fetch_array($result)){
                
$positions[]="$tes[positions] ";
                
$dates[]="$tes[date] ";
                
$time[]="$tes[start_time] - $tes[end_time] ";
            } 
y despues en el array a reemplazar pongo:
Código PHP:
$reemplazos[16] = implode(" ",$dates);
            
$reemplazos[17] = implode(" ",$time);
            
$reemplazos[18] = implode(" ",$loca); 
un problema menos jejeje
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:51.