我需要在我的网站上实现与wikilinks类似的功能。用户输入纯文本,只要有内部链接,就会输入[[asdf]]。只有前五个例子真正适用于我需要的实现。
你会使用正则表达式,表达式会这样做吗?那里的某个库已经在C#中已经有了吗?
答案 0 :(得分:2)
在纯正则表达式方面,表达式宁愿是:
\[\[([^\]\|\r\n]+?)\|([^\]\|\r\n]+?)\]\]([^\] ]\S*)
\[\[([^\]\|\r\n]+?)\]\]([^\] ]\S*)
将(.+?)
suggested by David替换为([^\]\|\r\n]+?)
,确保只捕获合法的wiki链接文本,而不关闭方括号或换行符。
([^\] ]\S+)
确保wiki链接表达式后面没有结束方括号。
我注意到是否有C#库已经实现了这种检测。
但是,要使用regexp使这种检测真正完全正确,您应该使用C#regexp引擎中的pushdown automaton,illustrated 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被设置为显示文本并且链接显示在页面上。我因此交换了它们。