Wikilinks - 将文本[[a]]转换为内部链接

时间:2009-01-26 04:41:45

标签: c# regex wikipedia

我需要在我的网站上实现与wikilinks类似的功能。用户输入纯文本,只要有内部链接,就会输入[[asdf]]。只有前五个例子真正适用于我需要的实现。

你会使用正则表达式,表达式会这样做吗?那里的某个库已经在C#中已经有了吗?

3 个答案:

答案 0 :(得分:2)

在纯正则表达式方面,表达式宁愿是:

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

(.+?) suggested by David替换为([^\]\|\r\n]+?),确保只捕获合法的wiki链接文本,而不关闭方括号或换行符。

最后的

([^\] ]\S+)确保wiki链接表达式后面没有结束方括号。

我注意到是否有C#库已经实现了这种检测。

但是,要使用regexp使这种检测真正完全正确,您应该使用C#regexp引擎中的pushdown automatonillustrated here.

答案 1 :(得分:1)

我不知道是否有现有的库可以执行此操作,但如果是我,我可能只使用正则表达式:

  • 匹配\[\[(.+?)\|(.+?)\]\](\S+)并替换为<a href="\2">\1\3</a>
  • 匹配\[\[(.+?)\]\](\S+)并替换为<a href="\1">\1\2</a>

或类似的东西,无论如何。

答案 2 :(得分:1)

虽然这是一个老问题并且已经回答了,但我想我会将此作为附录中的其他人添加。现有的两个答案完成了所有实际工作,并且在那里得到了90%,但这是最后一点,任何寻找代码的人都可以直接尝试:

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

实际正则表达式的唯一变化是我认为原始答案的替换部分是错误的,因此href被设置为显示文本并且链接显示在页面上。我因此交换了它们。