Pergunta

Eu preciso implementar algo semelhante a wikilinks no meu site. O usuário está entrando em texto simples e vai entrar [[asdf]] onde quer que haja uma ligação interna. Somente os primeiros cinco exemplos são realmente aplicáveis ??na necessidade de implementação I.

Você usaria regex, que expressão faria isso? Existe uma biblioteca lá fora em algum lugar que já faz isso em C #?

Foi útil?

Solução

No lado regexp pura, a expressão preferiria ser:

\[\[([^\]\|\r\n]+?)\|([^\]\|\r\n]+?)\]\]([^\] ]\S*)
\[\[([^\]\|\r\n]+?)\]\]([^\] ]\S*)

Ao substituir o (.+?) sugerido por David com ([^\]\|\r\n]+?), você garante a capturar apenas legítimos ligações wiki textos, sem fechar quadrado colchetes ou caracteres de nova linha.

([^\] ]\S+) no final assegura a expressão do elo wiki não é seguido por um colchete de fechamento ou.

Estou nota certeza se há C # bibliotecas já implementar este tipo de detecção.

No entanto, para fazer esse tipo de detecção realmente full-prova com regexp, você deve usar o pushdown autômato presente no motor de C # expressão regular, como ilustrado aqui.

Outras dicas

Eu não sei se existem bibliotecas existentes para fazer isso, mas se fosse comigo eu provavelmente só usar expressões regulares:

  • \[\[(.+?)\|(.+?)\]\](\S+) jogo e substituir com <a href="\2">\1\3</a>
  • \[\[(.+?)\]\](\S+) jogo e substituir com <a href="\1">\1\2</a>

Ou algo assim, de qualquer maneira.

Embora esta é uma questão de idade e já respondeu, pensei em adicionar isso como uma adenda para qualquer outra pessoa que vem junto. As duas respostas existentes fazem todo o trabalho real e me pegou 90% lá, mas aqui é o último bit para quem procura código para obter em frente com a tentativa:

string html = "Some text with a wiki style [[page2.html|link]]";
html = Regex.Replace(html, @"\[\[([^\]\|\r\n]+?)\|([^\]\|\r\n]+?)\]\]([^\] ]\S*)", @"<a href=""$1"">$2$3</a>");
html = Regex.Replace(html, @"\[\[([^\]\|\r\n]+?)\]\]([^\] ]\S*)", @"<a href=""$1"">$1$2</a>");

A única alteração para o regex real é que eu acho que a resposta original tinha as peças de reposição da forma errada, então a href foi definido para o texto de exibição ea ligação foi mostrado na página. Eu, portanto, virar-los.

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