Wikilinks - превратить текст [[a]] во внутреннюю ссылку - PullRequest
3 голосов
/ 26 января 2009

Мне нужно реализовать что-то похожее на wikilinks на моем сайте. Пользователь вводит простой текст и вводит [[asdf]] везде, где есть внутренняя ссылка. Только первые пять примеров действительно применимы в нужной мне реализации.

Вы бы использовали регулярное выражение, какое выражение будет делать это? Есть ли где-нибудь библиотека, которая уже делает это в C #?

Ответы [ 3 ]

2 голосов
/ 26 января 2009

На чистом регулярном выражении выражение скорее будет:

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

Заменив (.+?) , предложенный Дэвидом , на ([^\]\|\r\n]+?), вы гарантируете захват только разрешенных текстов вики-ссылок без закрывающих квадратных скобок или символов новой строки.

([^\] ]\S+) в конце гарантирует, что за выражением вики-ссылки не следует закрывающая квадратная скобка.

Я уверен, если есть библиотеки C #, уже реализующие этот тип обнаружения.

Однако, чтобы сделать такое обнаружение действительно полным доказательством с помощью регулярного выражения, вы должны использовать нажимной автомат , присутствующий в движке регулярного выражения C #, как показано здесь .

1 голос
/ 03 июня 2016

Хотя это старый вопрос и на него уже дан ответ, я подумал, что добавлю это в качестве дополнения для всех, кто придет. Существующие два ответа делают всю настоящую работу и дают мне 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 был установлен для отображаемого текста, а ссылка была показана на странице. Поэтому я поменял их местами.

1 голос
/ 26 января 2009

Я не знаю, существуют ли библиотеки для этого, но если бы это был я, я бы просто использовал регулярные выражения:

  • соответствует \[\[(.+?)\|(.+?)\]\](\S+) и заменяется на <a href="\2">\1\3</a>
  • соответствует \[\[(.+?)\]\](\S+) и заменяется на <a href="\1">\1\2</a>

Или что-то в этом роде.

...