2009-05-27 19 views
-1

私のアプリケーションは、社内Webサイトの記事を動的に構築するために使用される内部ユーザーから提供されるHTMLコンテンツを収集します。C#カスタムHTMLタグを置き換える正規表現

私は、ユーザーが<検索> .... < /検索>と内容がデータベースに保存され、アプリケーションと呼ばれる特殊なタグを含むHTMLコンテンツ内の単語/フレーズを囲むことができる機能を実装したいです<検索>ワード/フレーズ< /検索>は、単語やフレーズをエンコードした後、www.google.com/?q=WORD/PHRASEと表示されます。

私は、正規表現は、この機能を実現するために使用することができると思いますが、複数の<検索> .... HTMLコンテンツ内の< /検索>タグがあるかもしれないので、それについて移動する方法についていくつかのガイダンスを必要とします。

例に関するご意見はありがとうございます。

答えて

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>")); 
+0

これは完全に動作します、逆にできますか?リンクを検索タグに変換しますか?たとえば、マッチの目的で特殊な属性(たとえば、class = "searchterm")を持つ

1

HTML DOMを使用して正規表現ではなく内容を解析することを検討する必要があります。 Regexesはhtmlを解析することを意図しており、複雑で予期せぬバグを持つことで有名です。

+0

あなたは、私が使用したいカスタムタグのようにhtml domを使用する方法の例を挙げることができますか? –

+0

DanHerbertのより完全な答えを参照 – configurator

0

検索タグを入れ子にすることはできないと仮定すると、欲張りの一致が非常に簡単です。

は、あなたが最初のグループ内の疑問符は「このグループに一致するようにできるだけ少ないグループ」を意味

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

を試みる場合があります

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

1

に交換します。

1

正規表現は、XML/HTMLデータを渡すに悪いです。実際のHTMLまたはXML読み込みAPIを使用する方がよいでしょう。正規表現は、例えばネストされたタグを持つHTMLを扱うときに問題に遭遇します。

タグスープHTMLを取得している可能性が最も高い場合は、.NETのネイティブXmlDocumentクラスを使用することはできません。 HtmlAgilityPackには、XmlDocumentのAPIとまったく同じAPIがありますが、整形式にHTMLを整理するなどのHTML固有のものがいくつか含まれています。

この例ではXmlDocumentクラスを使用していますが、HtmlAgilityPackのHtmlDocumentは非常に似ている必要があります(XmlDocumentの代わりにHtmlDocumentを使用する)。これにより、<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); 

免責事項:私は上記の例のコードをテストしていませんが、それが動作するはずです。

関連する問題