0

次のような再帰的な html テキストがあります。

string html = "<input id=\"txt0\" value=\"hello\"></input>some undefined text<input id=\"txt1\" value=\"world\"></input>";

これは n 回繰り返すことができます (例では n=2) が、n は未知の変数です。

'value' 属性内のすべてのテキスト ('hello' と 'world' の例) を、正規表現を使用して配列内のテキストに置き換えたいと考えています。

Regex rg = new Regex(which pattern?, RegexOptions.IgnoreCase);
int count= rg.Split(html).Length - 1; // in the example count = 2

for (int i = 0; i < count; i++)
{
     html= rg.Replace(html, @"value=""" + myarray[i] + @""">", 1);
}

私の問題は、これらの置換を行うための正しい正規表現パターンが見つからないことです。

次のようなものを使用する場合:

Regex rg = new Regex(@"value="".*""", RegexOptions.IgnoreCase);
int count= rg.Split(html).Length - 1;

for (int i = 0; i < count; i++)
{
     html= rg.Replace(html, @"value=""" + myarray[i] + @"""", 1);
}

私はhtmlのように取得します

<input id="txt0" value="lorem ipsum"></input>

パターンの .* には余分な文字が含まれているため、次まで停止する必要があります

'<input'

発生。

結果は次のようになります。

<input id="txt0" value="lorem ipsum"></input>some undefined text<input id="txt1" value="another text"></input>

提案や助けをいただければ幸いです。ありがとう!

4

2 に答える 2

1

他の人がコメントで指摘したように、html を正規表現で解析しようとしないでください。

inputwith value があるとします<input id=txt2 value="x">

<input id=txt1 value='<input id=txt2 value="x">' >簡単に解析できますか?

したがって、Html パーサーを使用します。サンプルのHtml Agility Packに使用します

string html = "<input id=\"txt0\" value=\"hello\"></input>some undefined text<input id=\"txt1\" value=\"world\"></input>";
var myarray = new List<string>() { "val111", "val222", "val333" };

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

int count = 0;
foreach(var inp in doc.DocumentNode.Descendants("input"))
{
    if (inp.Attributes["value"] != null) 
        inp.Attributes["value"].Value = myarray[count++]; 
}
于 2012-08-28T17:23:50.140 に答える
0

HTMLパーサーを使用するように促す傾向がありますが、 HTML入力があなたの例と同じくらい単純で、LBが彼の答えに持っているようなファンキーなHTMLがない場合、問題の解決策はただ貪欲にならないでください:

    Regex rg = new Regex(@"value="".*""?", RegexOptions.IgnoreCase);

クエスチョン マークは、Regex に、パターンの可能な限り短い一致で停止するように指示します。

于 2012-08-29T06:14:14.523 に答える