3

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

你会使用正则表达式,什么表达式会这样做?是否有某个库已经在 C# 中执行此操作?

4

3 回答 3

2

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

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

通过将(.+?) David 的建议替换为([^\]\|\r\n]+?),您可以确保仅捕获合法的 wiki 链接文本,而无需右方括号或换行符。

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

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

但是,要使用正则表达式进行真正的全面检测,您应该使用C# 正则表达式引擎中存在的下推自动机,如此处所示。

于 2009-01-26T07:29:19.073 回答
1

我不知道是否有现有的库可以做到这一点,但如果是我,我可能只会使用正则表达式:

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

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

于 2009-01-26T06:13:59.273 回答
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 设置为显示文本并且链接显示在页面上。因此,我交换了它们。

于 2016-06-03T14:17:54.987 回答