2009-01-26 8 views
3

Je dois implémenter quelque chose de similaire à wikilinks sur mon site. L'utilisateur entre du texte brut et entrera [[asdf]] partout où il y a un lien interne. Seuls les cinq premiers exemples sont vraiment applicables dans la mise en œuvre dont j'ai besoin.Wikilinks - transforme le texte [[a]] en un lien interne

Utilisez-vous regex, quelle expression ferait cela? Y a-t-il une bibliothèque quelque part qui le fait déjà en C#?

Répondre

2

Du côté pur regexp, l'expression serait plutôt:

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

En remplaçant le (.+?)suggested by David avec ([^\]\|\r\n]+?), assurez-vous de saisir uniquement wiki légitime des liens textes, sans fermer les crochets ou des caractères de nouvelle ligne. À la fin, l'expression du lien wiki n'est pas suivie d'un crochet fermant non plus.

Je suis sûr que des bibliothèques C# implémentent déjà ce type de détection.

Cependant, pour faire ce genre de détection vraiment à l'épreuve complète avec regexp, vous devez utiliser le présent pushdown automaton dans le moteur C# regexp, comme illustrated here.

1

Je ne sais pas s'il y a des bibliothèques existantes pour ce faire, mais si elle était moi, je serais probablement juste utiliser regexes:

  • rencontres \[\[(.+?)\|(.+?)\]\](\S+) et les remplacer par <a href="\2">\1\3</a>
  • match de \[\[(.+?)\]\](\S+) et remplacerai avec <a href="\1">\1\2</a>

Ou quelque chose comme ça, de toute façon.

1

Bien que ce soit une question ancienne et déjà répondu, je pensais que je J'ajouterais cela comme un addendum pour quelqu'un d'autre. Les deux réponses existantes font tout le travail réel et m'a obtenu 90% là-bas, mais voici le dernier bit pour ceux qui cherchent code pour obtenir tout droit à essayer:

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>"); 

Le seul changement à la regex est I pense que la réponse originale avait les pièces de rechange dans le mauvais sens, de sorte que le href a été mis au texte d'affichage et le lien a été montré sur la page. Je les ai donc échangés.

Questions connexes