PHP substituir, mas Alternate Cadeia de substituição
Pergunta
Ok, aqui está o que estou tentando fazer: Eu estou tentando usar o PHP para desenvolver o que é essencialmente um pequena subconjunto de uma implementação de remarcação, não vale a pena usar uma classe remarcação completo
Eu preciso essencialmente fazer um str_replace, mas alternar o texto de substituição para cada ocorrência da agulha, de modo a lidar com a abertura e fechamento de tags HTML.
Por exemplo, itálico são um par de asteriscos como esta * *, e os blocos de código estão rodeados por crase como `this`.
preciso substituir a primeira ocorrência de um par de caracteres, com o tag de HTML de abertura correspondente, e o segundo com o código de fecho.
Algumas ideias sobre como fazer isso? Imaginei algum tipo de expressão regular estaria envolvido ...
Solução
Pessoalmente, eu loop através de cada ocorrência de *
ou \
com um contador, e substituir o personagem com a tag HTML apropriada com base na contagem (por exemplo, se a contagem é mesmo e você acertar um asterisco, substituí-lo com <em>
, se é estranho, em seguida, substituí-lo com </em>
, etc).
Mas se você tem certeza que você só precisa para suportar um par simples tipos de marcação, em seguida, uma expressão regular para cada poderia ser a solução mais fácil. Algo como isto para asteriscos, por exemplo (não testado):
preg_replace('/\*([^*]+)\*/', '<em>\\1</em>', $text);
E algo semelhante para barras invertidas.
Outras dicas
O que você está procurando é mais comumente tratada por uma máquina de estado ou lexer / analisador.
Esta é feio, mas ele funciona. Captura:. Apenas para um tipo de padrão de cada vez
$input = "Here's some \\italic\\ text and even \\some more\\ wheee";
$output = preg_replace_callback( "/\\\/", 'replacer', $input );
echo $output;
function replacer( $matches )
{
static $toggle = 0;
if ( $toggle )
{
$toggle = 0;
return "</em>";
}
$toggle = 1;
return "<em>";
}