Pergunta

Eu gostaria de trabalhar em um filtro BBCode para um site PHP. (Estou usando o CakePhp, seria um ajudante BBCode) Eu tenho alguns requisitos.

BBCodes podem ser aninhados. Então, algo assim é válido.

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

BBCodes pode ter 0 ou mais parâmetros.

Exemplo:

[video: url="url", width="500", height="500"]Title[/video]

BBCodes pode ter comportamentos mutliple.

Deixe dizer, [url]text[/url] seria transformado para [url:url="text"]text[/url]Ou o vídeo BBCode seria capaz de escolher entre o YouTube, Dailymotion ....

Eu acho que cobre a maioria das minhas necessidades. Eu já fiz algo com Regex. Mas meu maior problema era corresponder aos parâmetros. Na verdade, eu tenho o BBCode aninhado para funcionar e BBCode com 0 parâmetros. Mas quando adicionei uma correspondência regex para parâmetros, ele não correspondia corretamente ao BBCode aninhado.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // não era.* Mas o Matcher não pego

Eu não tenho o regex completo comigo agora, mas eu tinha algo que parecia assim (acima).

Portanto, existe uma maneira de combinar o BBCode com eficiência com Regex ou outra coisa. A única coisa que consigo pensar é usar o padrão do visitante e dividir meu texto com cada tags possível dessa maneira, posso ter um pouco mais de controle sobre o meu texto analisando e provavelmente poderia validar meu documento, para que o texto de entrada não 'T tem bbcode válido. Eu poderia notificar o usuário com um erro antes de salvar qualquer coisa.

Eu usaria o SABLECC para criar meu analisador de texto.http://sablecc.org/

Alguma ideia melhor? Ou qualquer coisa que possa levar a um analisador BBCode flexível eficiente?

Obrigado e desculpe pelo meu inglês ruim ...

Foi útil?

Solução

Há ambos PECL e PERA BBCode Parsing Library. O software é difícil o suficiente sem reinventar anos de trabalho por conta própria.

Se nenhum deles for uma opção, eu me concentraria em transformar o BBCode em uma string XML válida e, em seguida, usar sua rotina de análise XML favorita. Muito, muito difícil aqui, mas

  1. Execute o código através de htmlspecialchars para escapar de quaisquer entidades que precisem escapar

  2. Transforme todos [e] caracteres em <e> respectivamente

  3. Não se esqueça de explicar o cólon em casos como [TagName:

Se o BBCode foi aninhado corretamente, você estará pronto para passar essa string em um objeto de análise XML (simplexml, DomDocument, etc.)

Outras dicas

Existem várias bibliotecas existentes para analisar o BBCode, pode ser mais fácil olhar para elas do que tentar rolar o seu próprio:

Aqui está um casal, tenho certeza de que há mais se você olhar em volta:
PECL BBCODE
Pear html_bbcodeparsser

Tenho procurado o BBCode me analisa. A maioria deles usa Regex e Php4 e produz erros no Php 5.2+ ou não funciona. PECL BBCode e Pear HTML_BBCODEPARSER Não parecem mais mantidos (final de 2012) e não são facilmente instalados na configuração de hospedagem compartilhada com a qual tenho que trabalhar. StringParser_BBCode Trabalha com alguns pequenos ajustes para 5,2+, mas o método para adicionar novas tags é desajeitado e foi atualizado pela última vez em 2008.

Enterrado na 4ª página de uma busca de bing (eu estava ficando desesperada) que encontrei JBBCODE, que parece novo e requer Php 5.3. MIT LISENCE. Ainda não tentei criar tags personalizadas, mas até agora é o único que tentei que funciona fora da caixa em uma conta de hospedagem compartilhada com o Php 5.3.

Respondendo a: "Alguma ideia melhor?" (E estou assumindo que este foi um convite não apenas para melhorias em relação às sugestões específicas do BBCode)

Recentemente, analisamos a rota do BBCode e decidimos usar htmlpurifier em vez de. Esta decisão foi baseada em parte nas comparações (provavelmente tendenciosas) entre vários métodos listados pelo grupo HTMLPurifier aqui e a discussão do BBCode (novamente, pelo grupo htmlpurifer) aqui

E para o registro, acho que seu inglês foi muito bom. Tenho certeza de que é muito melhor do que eu poderia fazer em seu idioma nativo.

Usar preg_split() com PREG_DELIM_CAPTURE Sinalize para dividir o código-fonte em tags e não-pegadores. Em seguida, itera sobre tags mantendo a pilha de blocos abertos (ou seja, quando você vê a tag de abertura, adicione -a a uma matriz. Quando você vir a tag de fechamento, remova os elementos da extremidade da matriz até que a tag de fechamento corresponda à tag de abertura.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top