Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoas,
Simples: Quero que dentro de uma string o PHP interprete um grande conteúdo, e encontre tags especificas (ex.: % %, { }, etc) como algo que eu definir.
Ex.:
<?php
$conteudo = 'Meu conteúdo com uma string escondida, acesse o link: %link%';
$resultadoconteudo = '%link% == "<a href="http://meulink.com.br">clique aqui</a>"';
echo $a;
?>
No caso, eu quero uma function que mude o {$nome} para a string $nome.
Eu já fiz isso uma vez, mas não estou conseguindo encontrar novamente!
Obs: Esse código vou utilizar para a criação do meu sistema de temas/templates.
Abrass /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/biggrin.gif&key=cb0fdb2382312b39ddcb15831fcae62157015f17d2417528782628663387e929" alt="biggrin.gif" />
@Edit:
Só pra explicar, não quero incluir uma váriavel dentro de outra.
Seria isso ?
<?php
$nome = 'Cleiton';
$a = 'meu conteúdo '.$nome;
echo $a;
?>>
Seria isso ?
<?php
$nome = 'Cleiton';
$a = 'meu conteúdo '.$nome;
echo $a;
?>
Já corrigi minha explicação, antes estava confusa!
Você deverá utilizar expressões regulares para isso, caro Cleiton.
Veja um exemplo:
<?php
/**
* Conteúdo a ser trabalhado
*/
$content = "Meu conteúdo é {Cleiton}";
/**
* Expressão regular que pegará
* apenas o conteúdo dentro de "{}"
*/
$pattern = '/\{(.*?)\}/';
/**
* {Cleiton} será substituído por algo.
* Neste caso, pelo conteúdo que está dentro de {} — Cleiton
* Por isso ${1}: para pegarmos o primeiro valor que
* a expressão regular retornou
*/
$replacer = '${1}';
/**
* Fazemos as substituições desejadas com a expressão
* regular e a exibimos
*/
echo preg_replace($pattern, $replacer, $content);
Para maiores informações: Expressões regulares e preg_replace().
Espero ter ajudado. :thumbsup:
>
Seria isso ?
<?php
$nome = 'Cleiton';
$a = 'meu conteúdo '.$nome;
echo $a;
?>
ele disse q iria usar para template então acredito q ele vá guardar no banco de dados ou em outro arquivo assim acho q será necessário a função...
caso o contrário é so fazer o q você indicou
Cleiton da uma olhada nesse arquivo
<?php
$sql="select * from slide where codigo do cliente= '$codigo do cliente'";
$rs=mysql_query($sql) or die ("erro 1");
while($linha=mysql_fetch_array($rs))
{
$cod_cl_slide=$linha["cod_cl_slide"];
$script_cl_slide=$linha["script_cl_slide"];
$cod_cl_cliente_slide=$linha["cod_cl_cliente_slide"];
$altura_cl_slide=$linha["altura_cl_slide"];
$largura_cl_slide=$linha["largura_cl_slide"];
$script_configura_cl_slide=$linha["script_configura_cl_slide"];
$chamada_cl_slide=$linha["chamada_cl_slide"];
eval("\$script_configura_cl_slide = \"$script_configura_cl_slide\";");
$script_slide= $script_cl_slide." ".$script_configura_cl_slide."..$|$espacamento$|$..";<br />
$chamada_slide =$chamada_cl_slide."..$|$espacamento$|$..";
}
$script_slide=explode("..$|$espacamento$|$..", $script_slide);
$chamada_slide=explode("..$|$espacamento$|$..", $chamada_slide);
$slidefinal = str_replace($chamada_slide, $script_slide, $topo);
?>
é um arquivo q eu fiz acho q é mais ou menos isso q você quer
>
Você deverá utilizar expressões regulares para isso, caro Cleiton.
Veja um exemplo:
<?php
$content = "Meu conteúdo é {Cleiton}"; // Conteúdo
$pattern = '/\{(.*?)\}/'; // A expressão regular que pegará apenas o conteúdo dentro de {}
$replacer = '${1}'; // O que irá no lugar de "{Cleiton}". No caso, ${1} para pegar o primeiro valor retornado da expressão regular
echo preg_replace($pattern, $replacer, $content); // Faço a substituição desejada e exibo-a.
Para maiores informações: Expressões regulares e preg_replace().
Espero ter ajudado. /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif&key=f16394cbddc7140988e95da40d87cdc04e8fd18618efd400ded17391eb1801ce" alt="thumbsup.gif" />/>
Eu precisava só da função pra dar um refresh na minha memória, mas agradeço por ter dado o código pronto, muito obrigado!
Que isso, Cleiton! Estamos aqui para isso. Exemplificar é muito bom para aprender.
Abraço! :thumbsup:
Vou fazer isso para várias strings, como fazer de forma prática?
Se não, vou ter que fazer para cada string este código :(
Como assim, Cleiton? Vai incluir várias strings entre tags, como algo do tipo abaixo?:
<?php
/**
* Conteúdo a ser trabalhado
*/
$content = "Meu conteúdo é {Cleiton} {Garcia}";
Se sim, o que te mostrei já está preparado para trabalhar desta maneira.
Assim..
Terá o arquivo "index.php" e o "index.tpl".
Index.tpl:
A URL do site é {urlsite}, e o nome é {nomesite}!
Index.php
$urlsite = $config['url'];
$nomesite = $config['nome'];
Nesse caso, eu teria que criar dois códigos para exibir as duas strings diferentes.
Utilizai-vos um vetor!
index.php:
<?php
/**
* Extraímos as chaves do vetor
* para variáveis com seus respectivos
* valores
*/
extract(array('url' => 'http://google.com', 'name' => 'Google'));
/**
* Adiciona um include à variável $var
*/
$var = include('template.tpl');
/**
* Retorna o conteúdo deste include
*/
return $var;
template.tpl:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php echo "A URL do site é {$url}, e o nome é {$name}"; ?>
</body>
</html>Então.. eu não quero permitir e nem quero utilizar TAGs PHP no arquivo .tpl - ou seja, deverá ser assim:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{titulo}</title>
</head>
<body>
A URL do site é {url}, e o nome é {name}.
</body>
</html>>
Então.. eu não quero permitir e nem quero utilizar TAGs PHP no arquivo .tpl - ou seja, deverá ser assim:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{titulo}</title>
</head>
<body>
A URL do site é {url}, e o nome é {name}.
</body>
</html>
Expressões regulares aliadas às variáveis variáveis
<?php
$str = "Nome: {name}. Idade: {age}";
$name = "Evandro";
$age = 24;
preg_match_all('/{(.*?)}/', $str, $matches);
foreach ($matches[1] as $key => $val) {
$matches[1][$key] = $$val;
}
echo str_replace($matches[0], $matches[1], $str);>
Utilizai-vos um vetor!
index.php:
<?php
/**
* Extraímos as chaves do vetor
* para variáveis com seus respectivos
* valores
*/
extract(array('url' => 'http://google.com', 'name' => 'Google'));
/**
* Adiciona um include à variável $var
*/
$var = include('template.tpl');
/**
* Retorna o conteúdo deste include
*/
return $var;
template.tpl:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php echo "A URL do site é {$url}, e o nome é {$name}"; ?>
</body>
</html>
$topo="{$url},{$name}";
$chamada= explode(",", $chamada);
aproveitando pode ser feito tbm com o preg_replace (caso use expressão regular)
$final = str_replace($chamada, $var, $topo);
O que você quer é isso aqui:
index.php:
<?php
/**
* Um vetor com as variáveis
* a serem passadas para o template
**/
$placeholder = array(
'title' => 'Título',
'name' => 'Guilherme');
/**
* Resgata o conteúdo do arquivo template.tpl.
*/
$var = file_get_contents('template.tpl');
/**
* Exibe o conteúdo do arquivo template.tpl, utilizando
* o esquema de template com expressão
* regular.
*/
echo preg_replace('/\{(.*?)\}/e', '$placeholder["${1}"]', $var);
template.tpl:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{title}</title>
</head>
<body></body>
</html>
Era isso? Alguma dúvida? :thumbsup:
O @Sandro Matos citou preg_replace e eu me lembrei de uma parada bacana, exclusiva dessa função:
<?php
$str = 'Nome: {name}. Idade: {age}';
$vars = ['name' => 'Evandro', 'age' => 24];
echo preg_replace('/{(.*?)}/e', '$vars[\'$1\']', $str);
E agora que vi que é a mesma coisa que o Guilherme postou já faz tempo.
>
O que você quer é isso aqui:
index.php:
<?php
/**
* Um vetor com as variáveis
* a serem passadas para o template
**/
$placeholder = array(
'title' => 'Título',
'name' => 'Guilherme');
/**
* Resgata o conteúdo do arquivo template.tpl.
*/
$var = file_get_contents('template.tpl');
/**
* Exibe o conteúdo do arquivo template.tpl, utilizando
* o esquema de template com expressão
* regular.
*/
echo preg_replace('/\{(.*?)\}/e', '$placeholder["${1}"]', $var);
template.tpl:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{title}</title>
</head>
<body></body>
</html>
Era isso? Alguma dúvida? /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif&key=f16394cbddc7140988e95da40d87cdc04e8fd18618efd400ded17391eb1801ce" alt="thumbsup.gif" />
Fosse tudo nessa ocasião. Muitssimo obrigado!
Essa função solucionou tudo.. mas como eu posso fazer por exemplo, para vários arquivos de forma mais ecônimica, sem multiplicar o código para cada arquivo diferente que eu quiser usar.
Ou seja, eu quero incluir os arquivos "header.tpl", "login.tpl", "footer.tpl", como eu faço para incluir os três de uma vez só, seria ex.: em um IF, se você quiser verificar multiplas váriaveis é só fazer && e pronto. Neste caso, para eu verificar/incluir mais de um arquivo?
Grato.
Como eu faria para usar funções dessa maneira?
functions, ifs, while, etc.?
Tópico interessante. Recentemente passei por algo similar e resolvi assim:
$array = array( "@img" => "{$this->url}/conteudo/imagens", "@dir" => "{$this->url}/{$this->sede}", "@arq" => "{$this->url}/conteudo");
$texto = file_get_contents("{$artigo}");
foreach ($array as $key => $value) {
$texto = str_replace("{$key}", "{$value}", $texto);
}
Aqui, eu precisava pegar a URL pois eu precisava do endereço absoluto, então fiz assim. No arquivo teria algo como:
<img src="@img/rodape/copyright.png" alt="imagem para teste" />
Assim ele vai montar :
http://www.seusite.com/conteudo/imagens/rodape/copyright.png
Como o file_get_contents() não interpreta códigos PHP, ele simplismente pega tudo como String, foi necessário essa modificação.
Olá, Cleiton. Desenvolvi uma solução para você.
index.php:
<?php
/**
* Objeto que armazena as funções
* a serem passadas para um template
*/
final class Branch
{
/**
* Função sem parâmetro
*/
public function helloWorld()
{
echo 'Hello world!';
}
/**
* Função com um parâmetro
*/
public function welcome($name)
{
echo "Welcome, {$name}.";
}
}
/**
* Vetor com os padrões
* de expressão regular
* para o template
**/
$patterns = array(
'/\{(\w*?)\}(?<pattern_variables>)/', // Padrão para variáveis
'/\{(\@(\w*?))\(\'?(\w*?)\'?\)\}(?<pattern_functions>)/' // Padrão para funções
);
function replacements($matches)
{
/**
* Manipula as variáveis
* e as retorna para o template
*/
if (array_key_exists('pattern_variables', $matches)) {
/**
* Vetor com as variáveis
* a serem passadas para o template
**/
$variables = array(
'page' => 'Página principal',
'brand' => 'iMasters',
'user' => 'Guilherme'
);
/**
* Retorna o valor das variáveis
* para o template
*/
return $variables[$matches[1]];
/**
* Manipula as funções
* e as retorna para o template
*/
} elseif (array_key_exists('pattern_functions', $matches)) {
/**
* Instância o objeto
* que armazena/agrega
* todas as funções/métodos a
* serem enviadas para o template
*/
$branch = new Branch();
/**
* Retorna a função/método em questão
*/
return $branch->$matches[2]($matches[3]);
}
}
/**
* Resgata o conteúdo do arquivo template.tpl.
*/
$var = file_get_contents('template.tpl');
/**
* Exibe o conteúdo do arquivo template.tpl, utilizando
* o esquema de template com expressão
* regular.
*/
echo preg_replace_callback($patterns, "replacements", $var);
template.tpl:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{page} - {brand}</title>
</head>
<body></body>
</html>
Está tudo documentado e suficiente. Mas algumas observações:
-
{page} imprimirá uma variável simples.
-
{@helloWorld()} executará uma função. Em vermelho são os requisitos para a função ser executada. Se você não adicionar o arroba, teremos a interpretação de uma variável. Se você omitir os parêntesis, teremos um erro. Para adicionar um parâmetro, basta colocá-lo dentro do parêntesis no template da função. O critério para a passagem de parâmetros é relativo: se for inteiro, pode omitir; se for string, a aspas é necessária; se for uma variável no template, a aspas pode ser omitida.
Nesse caso em específico, implementei suporte a apenas um parâmetro por função, mas caso necessite, mãos à obra! Já dei o caminho para você.
E ah, as suas funções não necessariamente precisam estar dentro de um objeto, ok? Eu tomei essa atitude, por hora, porque achei mais elegante. :rolleyes:
Por hora, é isso.
Espero que esteja tudo bem esclarecido e claro.
Bons estudos! :thumbsup:
• Edit
Eis o meu milésimo post. Caprichei, ein? \o/
Guilherme Oderdenge, muito elegante seu post. Tentarei, em breve, testá-lo e implementá-lo em minha aplicação. A execução das funções da forma como você fez é de meu interesse.
Consigui perfeitamente o que eu queria. Muitissimo obrigado grande Guilherme Oderdenge. Realmente, muito obrigado!
a pouco eu tbm precisei disso
use a função eval()
http://php.net/manual/pt_BR/function.eval.php