preg_replace shim com eval support
Isso é muito desaconselhável. Mas se você não for um programador, ou realmente preferir um código terrível, você pode usar uma preg_replace
função substituta para manter seu /e
sinalizador funcionando temporariamente .
function preg_replace_eval($pattern, $replacement, $subject, $limit=-1) {
$pattern = preg_replace('/(\W[a-df-z]*)e([a-df-z]*)$/i', '$1$2', $pattern);
if (preg_match('/\(\.[+*]/', $pattern)) {
trigger_error("preg_replace_eval(): regex contains (.*) or (.+) placeholders, which easily causes security issues for unconstrained/user input in the replacement expression. Transform your code to use preg_replace_callback() with a sane replacement callback!");
}
return preg_replace_callback(
$pattern,
function ($matches) use ($replacement) {
$repl = preg_replace_callback(
'/(?<!\\\\)(?:[$]|\\\\)(\d+)/',
function ($m) use ($matches) {
if (!isset($matches[$m[1]])) { trigger_error("No capture group for '$m[0]' eval placeholder"); }
return addcslashes($matches[$m[1]], '\"\'\`\$\\\0');
},
$replacement
);
return eval("return $repl;");
},
$subject,
$limit
);
}
Em essência, você acabou de incluir essa função em sua base de código, e edita preg_replace
para preg_replace_eval
onde quer que o /e
foi usado bandeira.
Prós e contras :
- Realmente apenas testado com algumas amostras do Stack Overflow.
- Suporta apenas os casos fáceis (chamadas de função, não pesquisas de variáveis).
- Contém mais algumas restrições e avisos.
- Irá produzir erros deslocados e menos compreensíveis para falhas de expressão.
- No entanto, ainda é uma solução temporária utilizável e não complica uma transição adequada para
preg_replace_callback
.
- E o comentário da licença serve apenas para impedir as pessoas de usar demais ou espalhar isso muito longe.
Gerador de código de substituição
Agora, isso é um tanto redundante. Mas pode ajudar os usuários que ainda estão sobrecarregados com a reestruturação manual de seu código para preg_replace_callback
. Embora isso consuma efetivamente mais tempo, um gerador de código tem menos problemas para expandir a /e
string de substituição em uma expressão. É uma conversão nada notável, mas provavelmente é suficiente para os exemplos mais comuns.
Para usar esta função, edite qualquer preg_replace
chamada interrompida em preg_replace_eval_replacement
e execute-a uma vez . Isso imprimirá o preg_replace_callback
bloco correspondente a ser usado em seu lugar.
function preg_replace_eval_replacement($pattern, $replacement, $subjectvar="IGNORED") {
$pattern = preg_replace('/(\W[a-df-z]*)e([a-df-z]*)$/i', '$1$2', $pattern);
$replacement = preg_replace_callback('/[\'\"]?(?<!\\\\)(?:[$]|\\\\)(\d+)[\'\"]?/', function ($m) { return "\$m[{$m[1]}]"; }, $replacement);
$ve = "var_export";
$bt = debug_backtrace(0, 1)[0];
print "<pre><code>
#----------------------------------------------------
# replace preg_*() call in '$bt[file]' line $bt[line] with:
#----------------------------------------------------
\$OUTPUT_VAR = preg_replace_callback(
{$ve($pattern, TRUE)},
function (\$m) {
return {$replacement};
},
\$YOUR_INPUT_VARIABLE_GOES_HERE
)
#----------------------------------------------------
</code></pre>\n";
}
Lembre-se de que apenas copiar e colar não é programação. Você terá que adaptar o código gerado de volta aos nomes reais das variáveis de entrada / saída ou ao contexto de uso.
- Especificamente, a
$OUTPUT =
atribuição teria que ser encerrada se a preg_replace
chamada anterior fosse usada em um if
.
- É melhor manter as variáveis temporárias ou a estrutura do bloco de código de várias linhas.
E a expressão de substituição pode exigir mais melhorias de legibilidade ou retrabalho.
- Por exemplo,
stripslashes()
muitas vezes se torna redundante em expressões literais.
- As pesquisas de escopo variável requerem uma referência
use
ou global
para / dentro do retorno de chamada.
- As
"-$1-$2"
referências de captura entre aspas desigualmente terminarão quebradas sintaticamente pela transformação simples em "-$m[1]-$m[2]
.
A saída do código é apenas um ponto de partida. E sim, isso teria sido mais útil como uma ferramenta online. Essa abordagem de reescrita de código (editar, executar, editar, editar) é um pouco impraticável. No entanto, poderia ser mais acessível para aqueles que estão acostumados com a codificação centrada em tarefas (mais etapas, mais descobertas). Portanto, essa alternativa pode conter mais algumas perguntas duplicadas.