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 ...

Foi útil?

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>";
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top