Pergunta

Eu preciso ler uma string, detectar a {VAR}, e depois fazer um file_get_contents ( 'VAR.php') no lugar de {VAR}. O "VAR" pode ter qualquer nome, como TEST, ou contactar-FORM, etc. Eu não quero saber o que VAR é - não fazer uma condição hard-coded, mas apenas ver uma letra maiúscula tag alfanumérico cercado por chaves e apenas fazer um file_get_contents () para carregá-lo.

Eu sei que eu preciso usar preg_match e preg_replace, mas eu estou tropeçando através das expressões regulares sobre este assunto.

Como isso é útil? É útil em ligar WordPress.

Foi útil?

Solução

Orion acima tem uma solução correta, mas não é realmente necessário utilizar uma função de chamada de retorno no seu caso simples.

Assumindo que os nomes de arquivos são A-Z + hífens você pode fazê-lo em uma linha usando e bandeira / PHP no regex:

$str = preg_replace('/{([-A-Z]+)}/e', 'file_get_contents(\'$1.html\')', $str);

Este vai substituir qualquer instância de {VAR} com o conteúdo do VAR.html. Você pode prefixo um caminho para o segundo mandato, se você precisa especificar um diretório específico.

Existem as mesmas preocupações de segurança vagas, conforme descrito acima, mas eu não consigo pensar em nada específico.

Outras dicas

Você vai precisar de fazer uma série de coisas. Eu estou supondo que você pode fazer o trabalho braçal para obter os dados da página que você deseja pré-processar em uma string.

  1. Primeiro, você vai precisar da expressão regular para corresponder corretamente. Que deve ser bastante fácil com algo como /{\w+}/.

  2. Em seguida, você vai precisar usar todas as bandeiras para preg_match para obter o local de deslocamento nos dados da página. Esse deslocamento vai deixar você dividir a string no antes, correspondência, e depois de partes do jogo.

  3. Depois de ter as 3 partes, você vai precisar para executar o seu incluem, e cumpri-los juntos novamente.

  4. Ensaboe, enxague, repita.

  5. Parar quando você encontrar há mais variáveis.

Isso não é muito eficiente, e provavelmente há maneiras melhores. Você pode querer considerar fazer um preg_split em vez disso, a divisão em /[{}]/. Não importa como você cortá-lo você está assumindo que você pode confiar em seus dados de entrada, e isso vai simplificar todo o processo muito. Para fazer isso, eu colocar para fora o código assim:

  1. Leve o seu conteúdo e dividi-lo assim: $parts = preg_split('/[{}]/', $page_string);

  2. Escreva uma função recursiva sobre as partes com os seguintes critérios:

    • Halt quando o comprimento de arg é <3
    • Else, retornar uma nova matriz composta por
    • $ arg [0]. load_data ($ arg [1]). $ Arg [2]
    • além de tudo o que é deixado em $ argv [3 ...]
  3. Execute sua função mais de US $ peças.

Você pode fazê-lo sem expressões regulares (Deus me livre), algo como:

//return true if $str ends with $sub
function endsWith($str,$sub) {
    return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
}

$theStringWithVars = "blah.php cool.php awesome.php";
$sub = '.php';
$splitStr = split(" ", $theStringWithVars);
for($i=0;$i<count($splitStr);$i++) {
    if(endsWith(trim($splitStr[$i]),$sub)) {
        //file_get_contents($splitStr[$i]) etc...
    }    
}

Em cima da minha cabeça, você quer este:

// load the "template" file
$input = file_get_contents($template_file_name);

// define a callback. Each time the regex matches something, it will call this function.
// whatever this function returns will be inserted as the replacement
function replaceCallback($matches){
  // match zero will be the entire match - eg {FOO}. 
  // match 1 will be just the bits inside the curly braces because of the grouping parens in the regex - eg FOO
  // convert it to lowercase and append ".html", so you're loading foo.html

  // then return the contents of that file.
  // BEWARE. GIANT MASSIVE SECURITY HOLES ABOUND. DO NOT DO THIS
  return file_get_contents( strtolower($matches[1]) . ".html" );
};
// run the actual replace method giving it our pattern, the callback, and the input file contents
$output = preg_replace_callback("\{([-A-Z]+)\}", replaceCallback, $input);

// todo: print the output

Agora vou explicar o regex

 \{([-A-Z]+)\}
  • O \{ e \} apenas dizer-lhe para combinar com as chaves. Você precisa das barras, como { e } são caracteres especiais, então eles precisam escapar.
  • O ( e ) criar um agrupamento. Basicamente, isto permite extrair partes específicas do jogo. Eu usá-lo na função acima para apenas combinar as coisas dentro das chaves, sem correspondência das próprias chaves. Se eu não fizer isso, então eu preciso tirar a { e } fora do jogo, o que seria chato
  • O [-A-Z] diz que "corresponde a qualquer caractere maiúsculo, ou um -
  • O + após o meio [-A-Z] que precisa ter pelo menos 1 caráter, mas podemos ter até qualquer número.

Comparativamente falando, expressão regular são caros. Enquanto você pode precisar deles para descobrir quais arquivos para carga, você certamente não precisa deles para fazer a substituição, e provavelmente não deve usar expressões regulares. Afinal, você sabe exatamente o que você está substituindo assim porque você precisa de pesquisa difusa?

Use uma matriz associativa e str_replace para fazer suas substituições. suporta str_replace matrizes para fazer várias substituições de uma vez. Uma substituição de linha, sem loops.

Por exemplo:

$substitutions = array('{VAR}'=>file_get_contents('VAR.php'),
'{TEST}'=>file_get_contents('TEST.php'),
...
);

$outputContents = str_replace( array_keys($substitutions), $substitutions, $outputContents);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top