2011-06-20 9 views
1

角括弧が文字^に置き換えられたコンテンツを持つデータベースを使用しています。置き換えられたHTML括弧を復元するには?

^b^some text^/b^ 

は戻って適切なブラケットに^文字を変換するために、C#のソリューションを誰にもお勧めしてくださいすることができ、それはhtmlとして表示することができますか?私は正規表現のいくつかの種類の仕事をするだろうと推測している...?事前

+7

HTMLタグを '^'に置き換えるこの素晴らしいアイデアを持っていた開発者/アーキテクトは、同僚の陪審員との試合に直面し、最大の文章を得るでしょう(キーボードに近づかないでください)。彼が引き起こした損害は不可逆的なものだから - それは2つの異なる文字を1つのものに置き換えた - それは不可逆圧縮と呼ばれている:-) –

答えて

1

トリッキーなところ、完全に自動では不可能な点です。元のHTMLについていくつかの非常に便利な仮定をすることができない限り(すべての可能なHTMLの小さなサブセットであり、予測可能なパターン)。私は最終的に編集を手作業で行う必要があると思います。

実際のC#コードを含まないことを謝っていますが、私はそれに近づくことを考えています。

問題を段階的に進んで、一般的なパターンを最初に変換してみましょう。残りの^文字の数を減らすために、すべてのステップの後に目標があります。

だから、最初、正規表現置換する非常に一般的なリテラルのパターンがたくさん

^p^ -> <p> 
^div^ -> <div> 
^/div^ -> <div> 

など

次に、

^link[anything-except-^]^ -> <link[original-text]> 

と上と上のようなオプションのテキストが含まれているパターンを、交換してください。私のアプローチは、期待されるパターンだけを置き換えることです。そうすることで、誤ったマッチを回避します。次に^文字が残らなくなるまで他のパターンで繰り返します。これは、多くのデータの検査と多くのパターンを必要とします。それはスマートではなく、凶暴な力ですが、あなたはそこに行きます。

4

ありがとうございます、nが奇数であるnが偶数と<ある>を持つすべてのn番目の^文字を置き換えることができます。これが唯一の限り元のHTMLコードは、すべての<文字の決算>文字が含まれているように動作することを

var html = "^b^some text^/b^"; 

var n = 0; 
var result = Regex.Replace(html, "\\^", m => ((n++ % 2) == 0) ? "<" : ">"); 
// result == "<b>some text</b>" 

注意(<p<b>...が悪い)と、元のHTMLコードには^文字がなかったこと(<b>2^5</b>が悪いです) 。

+4

真実だが、まずこの問題に陥っていると仮定すれば、 – Brad

+0

+1正規表現の場合は、エッジのケースは私を緊張させるだろう。 –

+0

@ Ryan Emerle:OPは任意のユーザー入力を処理するのではなく、入力ストリングの固定セットを持つため、入力ストリングがすべて指定された制約と一致するかどうかを確認できます。このシナリオでは私のソリューションのアプローチは完全に有効だと思います。 OPはHTMLバリデーターを使用して出力が意味をなさないかどうかをチェックし、すべての入力文字列が適切な結果を得るまで正規表現を微調整することさえできます。 – dtb

2

もっと複雑ではあるが、より安全な解決策は、^ p、^ img、^ divなどの特定の文字セットとそれに対応する文字セットを検索することであろう。^/p ^、^/div ^、^/img ^など、それらを個別に置き換えることができます。

これは実現可能かどうかは、データにどのタグが存在するか、これを安全に行うためにどの程度の努力を払うかによって異なります。使用されているタグの有限集合があるかどうか知っていますか? HTMLが生成されたのか、誰かが手動で編集した可能性があります。必然的にパターン検索が複雑になります。

例えば、文字が出現するさまざまなインスタンスを検索して一覧表示するなど、いくつかの分析をまず行うことができますか?私たちが話しているデータの量はどれくらいですか、それは静的ですか、それとも(^問題を含む)成長し続けるのでしょうか?

関連する問題