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);
}

我得到像

<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 回答