-1

html源码

<form>
<input type="text" name="a" value="a1fa4" type="hidden"/>
<input type="text" name="b" value="b1fa9" type="hidden"/>
<input type="text" name="c" value="c1fd2" type="hidden"/>
<input type="text" name="d" value="d1fx1" type="hidden"/>
</form>

php源码

<?php
  preg_match_all('/<input name="(.*?)" value="(.*?)" type="hidden"\/>/i', $form, $input);

  $var = array();

  for($i=0;$i<count($input[1]);$i++){
    $var[$input[1][$i]] = $input[2][$i];
  }
?>

C# 源代码

Match match = Regex.Match(html, "<input name=\"(.*?)\" value=\"(.*?)\" type=\"hidden\"/>", RegexOptions.IgnoreCase );
while (match.Success)
{
    System.Console.WriteLine(" {0} {1} ", match.Value, match.Index);  
}

php 代码有效,但 c# 代码无效。如何修复 c# 代码?谢谢!

4

2 回答 2

3

如果你想用真正的Html 解析器而不是正则表达式来解析你的 html

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

var dict =  doc.DocumentNode
       .Descendants("input")
       .ToDictionary(n=>n.Attributes["name"].Value,n=>n.Attributes["value"].Value);
于 2012-09-29T08:32:28.503 回答
1

您的正则表达式的问题是您省略了type=\"text\". 以下作品:

string html =
    @"<form>
    <input type=""text"" name=""a"" value=""a1fa4"" type=""hidden""/>
    <input type=""text"" name=""b"" value=""b1fa9"" type=""hidden""/>
    <input type=""text"" name=""c"" value=""c1fd2"" type=""hidden""/>
    <input type=""text"" name=""d"" value=""d1fx1"" type=""hidden""/>
    </form>";

foreach(Match match in Regex.Matches(html, 
    "<input type=\"text\" name=\"(.*?)\" value=\"(.*?)\" type=\"hidden\"/>", 
        RegexOptions.IgnoreCase))
{
    // Group 0 is the string matched so get groups 1 and 2.
    System.Console.WriteLine("Name={0} Value={1} ", match.Groups[1].Value, 
        match.Groups[2].Value);
}

然而,正如 LB 所说,使用专用的 HTML 解析器而不是正则表达式,因为 HTML 不能保证是有效的 XML,可能包含不同的布局和编码等等。

如果您必须使用正则表达式,它们需要更加灵活。例如,属性和元素之间可能有更多或不同的空白。

于 2012-09-29T08:48:55.050 回答