Регулярное выражение конвертирует URL в гиперссылку - PullRequest
2 голосов
/ 17 июля 2010

Я погуглил некоторый код, который преобразует URL в гиперссылку, используя bbcode. Код:

// format the url tags: [url=www.website.com]my site[/url]
// becomes: <a href="www.website.com">my site</a>
exp = new Regex(@"\[url\=([^\]]+)\]([^\]]+)\[/url\]");
str = exp.Replace(str, "<a href=\"$1\">$2</a>");

// format the img tags: [img]www.website.com/img/image.jpeg[/img]
// becomes: <img src="www.website.com/img/image.jpeg" />
exp = new Regex(@"\[img\]([^\]]+)\[/img\]");
str = exp.Replace(str, "$1\" />");

Я также хочу конвертировать обычные ссылки в гиперссылки. Я погуглил еще немного и получил вот это:

exp = new Regex("(http://[^ ]+)");
str = exp.Replace(str, "<a href=\"$1\">$1</a>");

Проблема в том, что когда я их смешиваю и выполняется третье регулярное выражение, первые два будут испорчены. как это может привести к:

<img src="<a href='www.website.com/img/image.jpeg>www.website.com/img/image.jpeg</a>" />

как я могу указать в своем третьем регулярном выражении, что он не может преобразовывать строки, начинающиеся с 'href = "' или 'src ="'?

1 Ответ

1 голос
/ 17 июля 2010

Учитывая интересные комбинации тегов, которые пользователи могут бросить в вас, регулярные выражения быстро становятся громоздкими и трудными для анализа тегов.

BBCode - это, по сути, грамматика сама по себе, и лучший способ интерпретировать грамматику программным способом - с помощью реального синтаксического анализатора.

Посмотрите на http://bbcode.codeplex.com/. Я не могу ручаться за его эффективность, но они реализовали парсер для BBCode в C #, который может сделать то, что вы ищете.

...