我的应用程序收集内部用户提供的HTML内容,用于在公司网站上动态构建文章。
我希望实现一项功能,用户可以使用名为< search> ....的特殊标记围绕HTML内容中的单词/短语。< / search>当内容保存在数据库中时,应用程序将转换< search> WORD / PHRASE< / search>在对单词或短语进行编码后说www.google.com/?q=WORD/PHRASE。
我认为正则表达式可用于实现此功能,但需要一些指导如何进行,因为可能有多个< search> ....< / search>标记在HTML内容中。
感谢任何有关示例的帮助。
答案 0 :(得分:2)
这样的事情应该有效:
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 :(得分:1)
您应该考虑使用HTML DOM来解析内容而不是正则表达式。用于解析html的正则表达式因复杂和出现意外错误而臭名昭着。
答案 2 :(得分:1)
您可以尝试
Regex.Replace(strMyHtmlInputString, "\<search\>(.+?)\<\/search\>", "www.google.com/?q=\1")
第一组中的问号意味着“尽可能少地与该组匹配”。
答案 3 :(得分:1)
正则表达式不适合处理XML / HTML数据。你最好使用真正的HTML或XML阅读API。例如,当您处理在其中嵌套了标签的HTML时,正则表达式会遇到问题。
如果您正在获取最有可能的标签式HTML,那么在没有太多压力的情况下,您将无法使用.NET的本地XmlDocument类。您应该查看HtmlAgilityPack,其中的API与XmlDocument完全相同,但它包含一些HTML特定的内容,例如清理HTML以使格式正确。
此示例使用XmlDocument类,但使用HtmlAgilityPack的HtmlDocument应该非常相似(仅使用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);
免责声明:我上面没有测试过这个示例代码,但它应该有用。
答案 4 :(得分:0)
贪婪匹配应该非常容易,假设你无法嵌套搜索标签。
替换
<search>(.*?)</search> is going to be key.