Регулярное выражение C # для замены пользовательских тегов HTML - PullRequest
0 голосов
/ 27 мая 2009

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

Я хочу реализовать функцию, с помощью которой пользователи могут окружать слово / фразу в содержимом HTML специальным тегом .... , и когда содержимое сохраняется в базе данных, приложение преобразует WORD / PHRASE , чтобы сказать www.google.com/?q=WORD/PHRASE после кодирования слова или фразы.

Я думаю, что для достижения этой функциональности можно использовать регулярные выражения, но нужно некоторое руководство о том, как это сделать, поскольку в содержимом HTML может быть несколько тегов .... .

Любая помощь с примерами приветствуется.

Ответы [ 5 ]

2 голосов
/ 27 мая 2009

Примерно так должно работать:

string data = @"some text <search>search term 1</search> some more text <search>another search term</search>";
Console.WriteLine(Regex.Replace(data, @"(?:<search>)(.*?)(?:</search>)", @"<a href=""http://www.google.com/?q=$1"">$1</a>"));
1 голос
/ 27 мая 2009

Регулярные выражения плохо обрабатывают данные XML / HTML. Вам лучше использовать настоящий API для чтения HTML или XML. Регулярные выражения сталкиваются с проблемами, когда вы имеете дело с HTML, в котором есть вложенные теги, например.

Если вы получаете HTML-код тега-супа, которым вы, скорее всего, являетесь, вы не сможете использовать собственный класс .NET XmlDocument без особых усилий. Вы должны взглянуть на HtmlAgilityPack , который имеет API, точно такой же, как у XmlDocument, но он включает в себя некоторые специфические для HTML вещи, такие как очистка HTML для правильной формы.

В этом примере используется класс XmlDocument, но использование HtmlDocument в HtmlAgilityPack должно быть очень похожим (только использование HtmlDocument вместо XmlDocument). Это должно заменить тег <search /> ссылкой на Google.

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode searchTag = doc.SelectSingleNode("//search");
XmlElement linkTag = doc.CreateElement("a");
linkTag.InnerXml = searchTag.InnerXml;
linkTag.Attributes["href"].Value = "http://google.com/?q=" + linkTag.InnerText;
searchTag.ParentNode.ReplaceChild(searchTag, linkTag);

Отказ от ответственности: Я не тестировал этот пример кода выше, но он должен работать.

1 голос
/ 27 мая 2009

Вы можете попробовать

Regex.Replace(strMyHtmlInputString, "\<search\>(.+?)\<\/search\>", "www.google.com/?q=\1")

Знак вопроса в первой группе означает «группируйте как можно меньше, чтобы соответствовать этой группе».

1 голос
/ 27 мая 2009

Вам следует рассмотреть возможность использования HTML DOM для анализа содержимого, а не регулярных выражений. Регулярные выражения, предназначенные для анализа html, известны своей сложностью и неожиданными ошибками.

0 голосов
/ 27 мая 2009

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

Замена на

<search>(.*?)</search> is going to be key.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...