elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Problema con preg_replace
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema con preg_replace  (Leído 4,823 veces)
PhenfiX


Desconectado Desconectado

Mensajes: 859



Ver Perfil
Problema con preg_replace
« en: 10 Abril 2008, 20:47 pm »

Hola a todos!

Esta vez tengo un problema que al parecer es de fácil solución, solo que no la encuentro  :¬¬

Resulta que tengo esta fracción de código:

Código:
    <td>
      <b>{tdownload}:</b> <a href="{url}">{name}</a> <small>({size})</small> <b>{tclicks}:</b> {clicks} <br />
      <b>{tadded}:</b> {date} <br />
      <b>{tclicks}:</b> {clicks}
    </td>

En un fichero TPL (el que es usado para los templates), y al mismo le quiero insertar un poco de PHP, pero me topo con este otro fragmento de código:

Código:
$content .= preg_replace('/\{([^}]*)}/e', '$row[\\1]', $dmTemplateContent);

Que se encuentra en un fichero PHP, y que mediante include se combinan.

El problema, obviamente, es que al insertar código PHP en el fichero TPL, este me es remplazado por otros caracteres.

Ejemplo, si inserto "if ($pos == false) { ?>" el simbolo "{" se cambia por otro.

Me gustaría saber como puedo hacer para insertar PHP en el TPL, ya sea que ignore el preg_replace o que use otros caracteres.

No se si me expliqué, pero creo que si :P

Gracias por adelantado.


En línea

eLank0
eLhAcKeR r00Lz


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Problema con preg_replace
« Respuesta #1 en: 10 Abril 2008, 23:26 pm »

Hola,

Antes de nada quiero hacer una aclaración, en teoría los templates están hechos para que se separe el diseño del código, y por lo tanto no creo que sea una buena idea introducir código PHP en un archivo TPL.

Como lo que aparece en index.tpl depende del código del index.php, lo que podrías hacer es incluir en tu index.php un archivo con el código que quieras incluir.

Salu2


En línea

PhenfiX


Desconectado Desconectado

Mensajes: 859



Ver Perfil
Re: Problema con preg_replace
« Respuesta #2 en: 11 Abril 2008, 02:15 am »

Gracias por tu respuesta.

Me resulta bastante complicado explicarte por que no puedo hacerle como tú dices, ya lo intente de 4 formas, las 4 que se me ocurrieron.

Como propones: Genera conflicto en la linea antes mencionada.
Como yo decía: Modifica los {corchetes por otro símbolo.
Metiendo include no marca ni error ni funciona.

Si fueran simples páginas lo modificaría sin esfuerzo, el problema es que estoy hablando de un widget de Wordpress, y para hacerlo funcionar necesito meterle php antes y despues, y al hacerlo genera conflictos con un fuctions.php bastante complicado para mi entendimiento.

Lo que me interesa saber, y no he encontrado ni siquiera en php.net, es si puedo de alguna manera ignorar, o camuflar los corchetes anteponiendole otro símbolo.
Los corchetes son los que me causan problema.

Gracias
En línea

SirLanceCC


Desconectado Desconectado

Mensajes: 1.093


Ver Perfil WWW
Re: Problema con preg_replace
« Respuesta #3 en: 11 Abril 2008, 05:22 am »

¿que quieres hacer?
reemplazar {clicks} {name} por variables???


NO Ya te entendí... quieres incrustar php en el archivo template pero como la función reemplaza los corchetes {} por variables... si en el archivo templete escribes "if(x) {" estas usando corchetes que serán reemplazados y no se ejecutará el código que deseas...


Tendrías que explicar más ampliamente cual es tu ibjetivo final y cómo lo estás realizando, para que pueda ayudarte...
En línea

PhenfiX


Desconectado Desconectado

Mensajes: 859



Ver Perfil
Re: Problema con preg_replace
« Respuesta #4 en: 11 Abril 2008, 09:03 am »

Pues si, es justamente eso.

Tengo 2 ficheros, un functios.php y un template.tpl, juntos trabajan bien, pero me resulta muy complicado añadir un trozo de PHP al TPL.

El TPL es esto:
Código:
<table cellpadding="3" width="100%" border="0">
  <tr>
    <td width="35" style="vertical-align: top;">
      <img src="{icon}" alt="{icon}">
    </td>
    <td>
      <b>{tdownload}:</b> <a href="{url}">{name}</a> <small>({size})</small> <b>{tclicks}:</b> {clicks} <br />
      <b>{tadded}:</b> {date} <br />
      <b>{tclicks}:</b> {clicks}
    </td>
  </tr>
  <tr>
    <td colspan="2">{description}</td>
  </tr>
</table>

Como verás no es nada complicado, solo que el functions remplaza los corchetes por variables. Esta línea lo hace:

Código:
$content .= preg_replace('/\{([^}]*)}/e', '$row[\\1]', $dmTemplateContent);

No puedo añadir PHP al TPL porque se remplazan. No puedo añadir PHP al functions por que es una página SOLO de funciones. No puedo añadir PHP al index porque marca error.
La única solución que se me ocurre es intentar, como ya lo había mencionado, camuflar los corchetes del PHP insertados en el TPL.

Ya le di dos repasadas a Google y no logro hacerlo.
Lo que también se podría hacer es añadir al functions otro simbolo, y este usarlo para que se convierta en corchete, solo que no se hacerlo :P
En línea

SirLanceCC


Desconectado Desconectado

Mensajes: 1.093


Ver Perfil WWW
Re: Problema con preg_replace
« Respuesta #5 en: 11 Abril 2008, 13:27 pm »

Citar
No puedo añadir PHP al TPL porque se remplazan. No puedo añadir PHP al functions por que es una página SOLO de funciones. No puedo añadir PHP al index porque marca error.
Bueno pero que quieres que haga tu modificacion?

Citar
Lo que también se podría hacer es añadir al functions otro simbolo, y este usarlo para que se convierta en corchete, solo que no se hacerlo
Lo que puedes hacer es que deje de reemplazar {variable}  y reemplace [variable] o {{variable}} o *variable*. Aunque como dijeron no se ve bonito mezclar los tpl con codigo, y no se si se ejecute.

$content .= preg_replace('/\{([^}]*)}/e', '$row[\\1]', $dmTemplateContent);
A ver intenta cambiar esas llaves por doble llave o corchete o lo que quieras... recuerda que en tpl debes cambiar tambien las llaves por el simbolo para que las reemplace.
En línea

PhenfiX


Desconectado Desconectado

Mensajes: 859



Ver Perfil
Re: Problema con preg_replace
« Respuesta #6 en: 12 Abril 2008, 03:05 am »

Mira, para que me entiendas posteo los códigos:

TPL:
Código:
<table cellpadding="3" width="100%" border="0">
  <tr>
    <td width="35" style="vertical-align: top;">
      <img src="{icon}" alt="{icon}">
    </td>
    <td>
      <b>{tdownload}:</b> <a href="{url}">{name}</a> <small>({size})</small> <b>{tclicks}:</b> {clicks} <br />
      <b>{tadded}:</b> {date} <br />
      <b>{tclicks}:</b> {clicks}
    </td>
  </tr>
  <tr>
    <td colspan="2">{description}</td>
  </tr>
</table>

Functions:

Código:
### Load Download Page Template
function DownloadsManager_DownloadsPage($content) {
  global $wpdb, $table_prefix, $iconsdir;
  if(!preg_match("|<!--download table-->|", $content))
    return $content;
  $start = strpos($content, '<!--download table-->');
  $before = substr($content, 0, $start);
  $after = substr($content, 21+$start);
  $dmTemplate = 'wp-content/plugins/downloads-manager/page-download-template.tpl';
  $handle = @fopen($dmTemplate, 'r');
  if(!$handle)
    return __('Error... Unable to load page template. Search page-download-template.tpl in your plugin folder!','downloads-manager');
  $dmTemplateContent = fread($handle, filesize($dmTemplate));
  $content = "";
  $cats = $wpdb->get_results("SELECT id, name FROM ".$table_prefix."dm_category");
  if(!empty($cats)) {
    foreach($cats as $cat) {
      $rows = $wpdb->get_results("SELECT d.id,d.name,d.link,d.icon,d.category,d.description,d.date,d.clicks FROM ".$table_prefix."dm_downloads d WHERE d.category='".$cat->id."'", ARRAY_A);
      if(!empty($rows)) {
        $content .= "<h2 style=\"border-bottom: 1px dotted #CCC\">".$cat->name."</h2>";
        foreach($rows as $row) {
          $row['icon'] = $iconsdir.'/'.$row['icon'];
          $row['date'] = date('d/m/Y', $row['date']);
          $row['size'] = FileSizeOf($row['link']);
          $row['url'] = dm_get_url_type($row['id']);
          $dmTemplateContent = preg_replace('/\{(t)([^}]*)}/e', __('\\2','downloads-manager'), $dmTemplateContent);
          $content .= preg_replace('/\{([^}]*)}/e', '$row[\\1]', $dmTemplateContent);
        }
      }
    }
  }
  fclose($handle);
  $content = $before.$content.$after;
  return $content;
}

?>

Y el código que quiero instertar:

Código:
<?php

$agent = $_SERVER['HTTP_USER_AGENT'];
$pos = strpos($agent, "Firefox");

if ($pos == false) { ?>

<div>
Texto si no está usando FF
</div>

<? }else{ ?>

AQUÍ DEBE IR EL TPL

<? } ?>

Como ves, el código del TPL va en medio del script, y resulta bastante difícil hacerlo de otra forma.
Es un widget de Wordpress, por lo que modificar el fuctions afectaría a otras areas.

Para llamar al script se debe poner en el post:
Código:
<!--download table-->
...y esto muestra la tabla. Si añado PHP al post marca error.

Como te digo, la única solución (sin tener que modificar todo el widget) es encontrar la manera de camuflar el php, o bien, como tu dices, darle otro valor al corchete, e ahí el problema.
En línea

SirLanceCC


Desconectado Desconectado

Mensajes: 1.093


Ver Perfil WWW
Re: Problema con preg_replace
« Respuesta #7 en: 12 Abril 2008, 13:45 pm »

Yo lo haría algo asi

Código
  1. ### Load Download Page Template
  2. function DownloadsManager_DownloadsPage($content) {
  3.  global $wpdb, $table_prefix, $iconsdir;
  4.  if(!preg_match("|<!--download table-->|", $content))
  5.    return $content;
  6.  $start = strpos($content, '<!--download table-->');
  7.  $before = substr($content, 0, $start);
  8.  $after = substr($content, 21+$start);
  9.  $dmTemplate = 'wp-content/plugins/downloads-manager/page-download-template.tpl';
  10.  $handle = @fopen($dmTemplate, 'r');
  11.  if(!$handle)
  12.    return __('Error... Unable to load page template. Search page-download-template.tpl in your plugin folder!','downloads-manager');
  13.  $dmTemplateContent = fread($handle, filesize($dmTemplate));
  14.  $content = "";
  15.  $cats = $wpdb->get_results("SELECT id, name FROM ".$table_prefix."dm_category");
  16.  if(!empty($cats)) {
  17.    foreach($cats as $cat) {
  18.      $rows = $wpdb->get_results("SELECT d.id,d.name,d.link,d.icon,d.category,d.description,d.date,d.clicks FROM ".$table_prefix."dm_downloads d WHERE d.category='".$cat->id."'", ARRAY_A);
  19.      if(!empty($rows)) {
  20.        $content .= "<h2 style=\"border-bottom: 1px dotted #CCC\">".$cat->name."</h2>";
  21.        foreach($rows as $row) {
  22.          $row['icon'] = $iconsdir.'/'.$row['icon'];
  23.          $row['date'] = date('d/m/Y', $row['date']);
  24.          $row['size'] = FileSizeOf($row['link']);
  25.          $row['url'] = dm_get_url_type($row['id']);
  26.  
  27. //Creamos una variable con el mensaje pertinente
  28.          //Si no es firefox
  29.          if(strpos($_SERVER['HTTP_USER_AGENT'], "Firefox") == false){
  30.              $row['mensajeff'] = 'Usa FIREFOX pagano!';
  31.          } else { //si es
  32.              $row['mensajeff'] = ''; //nada
  33.          }
  34.  
  35. //Estas lineas se encargarán de escribir nuestro mensaje
  36.          $dmTemplateContent = preg_replace('/\{(t)([^}]*)}/e', __('\\2','downloads-manager'), $dmTemplateContent);
  37.          $content .= preg_replace('/\{([^}]*)}/e', '$row[\\1]', $dmTemplateContent);
  38.        }
  39.      }
  40.    }
  41.  }
  42.  fclose($handle);
  43.  $content = $before.$content.$after;
  44.  return $content;
  45. }
  46.  
  47. ?>

En el TPL sólo agregamos la variable {mensaje ff} donde quieras que aparaezca el mensaje
« Última modificación: 12 Abril 2008, 13:47 pm por SirLanceCC » En línea

PhenfiX


Desconectado Desconectado

Mensajes: 859



Ver Perfil
Re: Problema con preg_replace
« Respuesta #8 en: 12 Abril 2008, 18:18 pm »

Muchas gracias, ya lo probé y funciona. Solo que hay un problema, el TPL es condicional, osea que solo se muestra si están usando FF, no como un simple mensaje.

Me explico. Tengo una sección de descargas,  de plugins para FF, entonces si el usuario usa FF las muestra, si usa otro navegador le digo que son descargas exclusivas para FF.

¿En ese caso cómo sería?

Muchas gracias por tu ayuda
En línea

SirLanceCC


Desconectado Desconectado

Mensajes: 1.093


Ver Perfil WWW
Re: Problema con preg_replace
« Respuesta #9 en: 12 Abril 2008, 19:20 pm »

Mmmmm a veeeerrrr....
Código
  1. ## Load Download Page Template
  2. function DownloadsManager_DownloadsPage($content) {
  3. //Antes que nada verificamos si es firefox
  4. //Si no es firefox
  5.  if(strpos($_SERVER['HTTP_USER_AGENT'], "Firefox") == false) return '';
  6.  //devolvemos una cadena vacia para que sustituya a <!--download table--> supongo...
  7.  //Y con eso finaliza la función... sin mostrar nada...
  8. //pero si sí usamos firefox.. hace todo lo de aqui abajo y muestra lo que tiene que mostrar...
  9.  
  10.  global $wpdb, $table_prefix, $iconsdir;
  11.  if(!preg_match("|<!--download table-->|", $content))
  12.    return $content;
  13.  $start = strpos($content, '<!--download table-->');
  14.  $before = substr($content, 0, $start);
  15.  $after = substr($content, 21+$start);
  16.  $dmTemplate = 'wp-content/plugins/downloads-manager/page-download-template.tpl';
  17.  $handle = @fopen($dmTemplate, 'r');
  18.  if(!$handle)
  19.    return __('Error... Unable to load page template. Search page-download-template.tpl in your plugin folder!','downloads-manager');
  20.  $dmTemplateContent = fread($handle, filesize($dmTemplate));
  21.  $content = "";
  22.  $cats = $wpdb->get_results("SELECT id, name FROM ".$table_prefix."dm_category");
  23.  if(!empty($cats)) {
  24.    foreach($cats as $cat) {
  25.      $rows = $wpdb->get_results("SELECT d.id,d.name,d.link,d.icon,d.category,d.description,d.date,d.clicks FROM ".$table_prefix."dm_downloads d WHERE d.category='".$cat->id."'", ARRAY_A);
  26.      if(!empty($rows)) {
  27.        $content .= "<h2 style=\"border-bottom: 1px dotted #CCC\">".$cat->name."</h2>";
  28.        foreach($rows as $row) {
  29.          $row['icon'] = $iconsdir.'/'.$row['icon'];
  30.          $row['date'] = date('d/m/Y', $row['date']);
  31.          $row['size'] = FileSizeOf($row['link']);
  32.          $row['url'] = dm_get_url_type($row['id']);
  33.          $dmTemplateContent = preg_replace('/\{(t)([^}]*)}/e', __('\\2','downloads-manager'), $dmTemplateContent);
  34.          $content .= preg_replace('/\{([^}]*)}/e', '$row[\\1]', $dmTemplateContent);
  35.        }
  36.      }
  37.    }
  38.  }
  39.  fclose($handle);
  40.  $content = $before.$content.$after;
  41.  return $content;
  42. }

A ver si mi planteamiento es correcto y te funciona...
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con preg_replace() !! (solved) « 1 2 »
PHP
Diabliyo 16 8,232 Último mensaje 4 Febrero 2011, 22:50 pm
por Diabliyo
[Pregunta]: preg_replace es equivalente a mb_ereg_replace?
Desarrollo Web
Leguim 1 2,123 Último mensaje 6 Enero 2020, 05:42 am
por AlbertoBSD
Problemas con preg_replace(). Reemplazar palabras completas
Desarrollo Web
OssoH 0 1,749 Último mensaje 18 Octubre 2022, 16:27 pm
por OssoH
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines