Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rvlira

[Resolvido] Expressão regular multi-linha no php

Recommended Posts

Pessoal,

 

Estou tentando fazer uma espécie de implementação do BBCODE.

 

Tenho uma string com o seguinte texto:

 

[b]teste[/b]

[b]outro
[/b]

Estou aplicando nele a seguinte expressão regular:

 

$resultado = preg_replace('/(\[[Bb]])(.*)(\[\/[Bb]])/', '<b>\\2</b>', $texto);

Para o texto acima, a palavra "teste" ganha o negrito corretamente, porém "outro" não recebe. Ele não está conseguindo fazer o match da expressão regular porque a tag inicial ("") está numa linha diferente da tag final ("").

 

Imagino que deva existir uma forma de fazer com que o ele tente fazer o match procurando pelas demais linhas, não?

 

Agradeço pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parece que consegui avançar um pouco no problema.

 

Havia me esquecido do "/s" no final da expressão regular. Com ele o "." passa a representar "\r\n" também.

 

O problema agora é que ao utilizar a expressão regular desta forma, o "/s" faz com que ele busque até a última ocorrência da tag final para fazer o match. Ou seja, se eu tivesse a string:

 

[b]teste[/b]

[i]bla[/i]

[b]outro
[/b]

E aplicasse:

 

$resultado = preg_replace('/(\[[Bb]])(.*)(\[\/[Bb]])/s', '<b>\\2</b>', $texto);

O HTML gerado seria:

 

<b>teste[/b]

[i]bla[/i]

[b]outro
</b>

Em vez de:

 

<b>teste</b>

[i]bla[/i]

<b>outro
</b>

Alguém saberia como eu poderia alterar essa expressão regular?

 

Desde já agradeço.

 

Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

$resultado = preg_replace("/(\[[Bb]\])(.+?)(\[\/[Bb]\])/s", "<b>$2</b>", $texto);
* casa qualquer coisa até a ultima ocorrência "(\[\/[bb]\])" , por isto substitua por (.+?)

 

flws

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fernando, muito obrigado. Funcionou perfeitamente.

 

Eu na verdade não entendi exatamente o por quê de ter funcionado.

Tenho quase certeza que eu já tinha tentado "(.+?)".

Enfim... Vou voltar aos livros de RegExp, hehehehe...

 

t+!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.