• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

cyclop

ifs e elses e /ifs

62 mensagens neste tópico

Ora bem... um problema de queima de neuronios, tenho de fazer uma espécie de compilador de html.

A ideia é uma pessoa escrever por exemplo

{if var1}

{if var1<=1500}

Texto que quero mostrar

{else}

texto que nao quero

{/if}

{/if}

e no final retornar somente "Texto que quero mostrar".

Neste momento estou a fazer pregs replaces e replaces troco algumas posições pelas posições ou tags em PHP, mas quero retirar todo esse código php e usar esta logica como se fosse um sistema de templates...

Estou actualmente a tentar da seguinte forma (não usando regex)

faço explode do código pelo \n e incremento o substr de tudo o que tenha {if, caso encontre um {/if decremento... e se o incrementador for igual a 0 é porque encontrou o "filho do if", alguem me pode dar uma ideia menos complicada?

Obrigado e um grande abraço A todos os programadores

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Existe um sistema igual: Smarty

Senão quiseres ir por aí tens de procurar por um tema da informática: Gramáticas e Parsers.

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Existe um sistema igual: Smarty

Senão quiseres ir por aí tens de procurar por um tema da informática: Gramáticas e Parsers.

Cumprimentos

Não obrigado. Sou programador e o caso é muito especifico.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há e não é igual, o smarty faz o basico, faz replaces do meu codigo por  <? if(...) ?> e cria ficheiros novos para depois serem compilados pelo servidor, no meu caso, isso já não tem lógica, mas obrigado pela dica.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O smarty não tem necessariamente de criar ficheiros novos. E dá para extender. Basicamente o Smarty é um parser. E mesmo sendo um programador não tens de criar tudo de raiz. Todos nós usamos algo que já foi feito por outros. Cumprimentos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se calhar é algum tipo de trabalho onde tem mesmo de ser ele a fazer?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu desisti por enquanto de fazer esse motor, vou continuar a mandar evals nesses casos lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu desisti por enquanto de fazer esse motor, vou continuar a mandar evals nesses casos lol

Fazes muito bem, e eu não me importo nada, funciona xD :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu por acaso ate tenho interesse numa coisa deste género.. Talvez um dia quando quiser subir um bocadinho mais (mas apenas um bocadinho) a fasquia do meu sistema básico de templates.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu desisti por enquanto de fazer esse motor, vou continuar a mandar evals nesses casos lol

Tens a noção que evals são meio caminho andado para seres ownado, certo?
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@cyclop

Eu não tinha percebi o teu post na totalidade quando o li, mas agora acho que já percebi, mas diz-me uma coisa... Tu o que estas a fazer neste momento é substituir {if var} por if($var) {, depois {/if} por } e para finalizar mandas-lhe o eval? É isso que estas a fazer? Se for, o que tu querias fazer era deixar de fazer essa troca de código e interpretares tu, directamente, o código definido por ti correcto?

Disseste que era um caso muito especifico, eu entendo, mas podes elaborar? É algum trabalho para universidade/emprego/cliente? Ou és tu que queres mesmo fazer assim porque... Eu digo isto porque, um dos sistemas de templates mais usados, o Smarty, faz exactamente desta forma (substituir tags por código real PHP) e estou curioso em saber a tua verdadeira finalidade para não queres fazer igual.

Estava aqui a pensar e se calhar numa futura versão do meu sistema de templates acho que vou implementar uma coisa do género, mas da mesma forma que tu fizeste e não propriamente interpretar eu. Primeiro, porque julgo dar muito mais trabalho de programar e segundo, será que compensa? Ou seja, será que compensa interpretares uma série de tags definidas por ti que depois ainda será interpretado pelo PHP? Não será mais fácil como já tens, trocas as tags por código PHP e deixas o PHP interpretar tudo?

@djthyrax

Estas a ser radical de mais... Usar um eval() num template, no sentido que falas (segurança) é praticamente a mesma coisa que os templates do WordPress que são puro PHP. Eu posso chegar aos templates do WordPress e colocar lá código malicioso, e teres um ficheiro .php para um template acho que é a mesma coisa que ter um .html com montes de tags e ser preoceassdo pelo eval().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O objectivo é servir de template?

http://wiki.portugal-a-programar.pt/dev_web:php:sistema_minimalista_de_tempaltes

As validações do que queres ou não mostrar devem ser feitas antes e só depois carregado o template.

Se quiseres fazer isto por motivos académicos (não esotu a ver outro motivo), tens que arranjar forma de percorrer o teu código como se este fosse uma árvore.

Apanha todas as keywords usando regex e guarda a uma tabela com a posição delas associada ao conteudo. Depois escreve um ciclo que interprete o teu código. Isto tem que usar técnicas mais ou menos avançadas. com tecnicas simples não te safas nos blocos 'nested' ( como é que se diz em português? ).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled, não é bem a mesma coisa. Imagina que isto é o teu template:

<html>
<head>
<title><?=$title;?></title>
</head>
<body>
<?=$body;?>
<?php eval("system('$algoQueNaoEstaImplementadoEPortantoNaoEstaInicializado');");?>
</body>
</html>

E que tens isto num servidor com register_globals activo. Acho que já estás a ver a situação...

Tudo bem que isto não acontece 99% das vezes, mas usar coisas que trazem riscos quando há maneiras de o fazer sem riscos, é algo no mínimo parvo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou me esta a escapar algo ou não acontecia nada...

Supondo que esse teu codigo estava num ficheiro template.php bastava fazer $conteudo = file_get_contents('template.php') e depois processar a variavel $conteudo para remover tudo que fosse PHP e pronto...

Qual era a crise?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens a noção que evals são meio caminho andado para seres ownado, certo?

Lol, sim tenho, tenho total noção disso, e não me preocupa (tenho sempre uma carta na manga)

Quanto a finalidade, bem, a lógica disto é substituir um sistema antigo e pouco "expansivel" da empresa onde trabalho, este sistema serve para a equipa de webdesigners simplesmente escrever "pão" e "cagar uma listagem" (não é que eles vão usar alguma vez o if hten e else... mas... pronto... era mais uma opção)

Recuso o smarty, porque: neste momento (não é para me gabar ) está mais bem estruturado e mais simples de usar que o smarty seguindo a lógica do "pão".

Basicamente... esta historia toda dos ifs thens e elses era para criar um processo do genero, vou ao tpl, busco todas as setvars incrementadores, etc... criando uma array temporaria, que vai sendo "updatada" conforme os comandos que vao surgindo no tpl...

esta historia toda... pronto... só os ifs thens e elses é que estavam a ir para cache como php... e nao queria andar a fazer os famosos ifs com os evals para evitar a ida de codigo para cache....

Pah... é inventar uma linguagem de programaçao nova basicamente lol (quem já me conhece e esta a ler esta confusão toda já sabe que sou mau a explicar coisas... lol )

Vá... obrigado por tudo... mas se por acaso alguem tiver uma ideia mirabulante ou algum algoritomo é sempre bem vindo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A questão é que para usares aquele template tu ias fazer include, Nazgulled.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A questão é que para usares aquele template tu ias fazer include, Nazgulled.

Porquê? É alguma regra que tu definiste agora à pressão só para os teus argumentos terem alguma validade? Mas quem é que falou em include? Alguém falou em include? Não vi ninguem a falar em include e muito menos vi algum sitio que especificasse que fazer templates em PHP tinha de se usar include. E que parte do file_get_contents() foi que te escapou? Eu nunca usei includes para sistema de templates, nem nunca o vou fazer. Não sei onde foste buscar essa ideia...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled, não faz qualquer sentido fazeres file_get_contents() quando tens código válido (<?php echo $var; ?>) no teu template. Além disso, eu não estava a dizer que o estavas a fazer ou irias fazer, o cyclop é que o faz (again, não faz qualquer sentido fazeres file_get_contents() quando tens no teu código eval(), torna-se óbvio que quando se pôs lá os eval()s, estava a pensar simplesmente incluir o ficheiro).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@djthyrax

Mas para que raio quero eu evals() dentro do template? Tu é que estas parai a supor coisas que ninguém falou...

@cyclop

Eu ainda não percebi bem o que tu queres. Aquilo que eu disse anteriormente não serve? Tipo, tens o teu template e tal e fazes um file_get_contents. Depois tens {if var} e fazes um preg_replace e substituis por if($var). Ou seja, basicamente é pegares na especificação da "tua linguagem" e trocares por linguagem real do PHP. No fim vais ter o conteúdo todo de um determinado ficheiro (template) dentro de uma variável, por exemplo $template. Ou seja, bastava-te fazer:

eval("\$template_final = \"$template\";");
echo $template_final;

Isto é só um exemplo, deve certamente puder ser melhorado. E não acho que ias correr riscos nenhuns de seres ownado porque bastavas fazer o que disse antes. Após o file_get_contents, aplicas uma função que elimine todo o código PHP, e depois é só fazeres a troca da tua lingaugem pela do PHP. Assim, terás a certeza que o template não tem código PHP para além daquele que tu permites com a tua linguagem.

É só uma ideia... Agora se o objectivo é interpretar mesmo o código, bem, isso pode ser mais complicado e mais trabalhoso e não sei se o esse trabalho compensara esta técnica mais simples. Alguém mais dentro do PHP que se acuse...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esta discussão não está lá muito produtiva.

djthyrax, acho que tens um ódio pessoal contra evals, ainda não percebi em que sentido é que são mais perigosos do que outro mecanismo qualquer de inclusão de código.

Desde que o seu conteudo seja são não sei qual é o problema dos evals.

Só para ver se eu percebi bem, está aqui em discussão o uso ou não das funções eval ou include porque são perigosas?

Se formos por aí deixamos de usar computadores por motivos de segurança.

Quanto ao tópico princiapal... uma linguagem no topo de outra, para evitar uso desnecessário da última. Está aqui um problema conceptual, porque acabas por introduzir mais complexidade desnecessária e mais overhead, quando o objectivo era poupar recursos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@djthyrax

Mas para que raio quero eu evals() dentro do template? Tu é que estas parai a supor coisas que ninguém falou...

eu desisti por enquanto de fazer esse motor, vou continuar a mandar evals nesses casos lol

djthyrax, acho que tens um ódio pessoal contra evals, ainda não percebi em que sentido é que são mais perigosos do que outro mecanismo qualquer de inclusão de código.

Desde que o seu conteudo seja são não sei qual é o problema dos evals.

Eu e os eval()s só temos relações quando é estritamente necessário. O problema da maior parte do pessoal é que:

1 - O hosting que utilizam tem register_globals activa e não inicializam variáveis. Ou,

2 - Abusam de globals, e acabam por imprimir uma variável que usaram como sendo temporária, mas que era global. Ou,

3 - São estúpidos, coisa que não é rara entre os produtores de código em PHP.

Quanto ao tópico princiapal... uma linguagem no topo de outra, para evitar uso desnecessário da última. Está aqui um problema conceptual, porque acabas por introduzir mais complexidade desnecessária e mais overhead, quando o objectivo era poupar recursos.

Do ponto de vista da performance, concordo plenamente contigo, mas há casos em que interessa mais a facilidade da construção de templates e se justifica separar o core do template usando um sistema similar ao do Planet.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora