从输入标记获取名称和值

时间:2010-05-28 04:09:17

标签: html regex

在你说“哦不,不再”之前,我在说明我的情况。我正在解析部分HTML输出,我唯一感兴趣的是每个name&gt;的value<input/属性。标签。 HTML实际上是HTML片段,可能格式不正确。我没有DOM或HTML解析器,我也不尝试解析嵌套元素。问题是我不知道属性的顺序或数量,因此可能是<input name="foo" value="boo"/><input type="hidden" name=foo><input id=blah value='boo' src="image.png" name="foo" type="img"/>

是否有一个正则表达式能够以可预测的顺序获得namevalue属性的值?如果我认为name属性总是在value之前,我就不会问这个问题,但不幸的是情况并非如此

2 个答案:

答案 0 :(得分:2)

要将namevalue的值放入同一个捕获组中,无论顺序如何,都可以尝试

<input (?=[^>]* name=["']([^'"]*)|)(?=[^>]* value=["']([^'"]*)|)

如果您的正则表达式实现支持前瞻。 这假定引用了值。

答案 1 :(得分:0)

这是使用.NET的正则表达式语法的解决方案:

var regex = new Regex(@"
        <input
            (
                \s*
                (?<name>[^=]+)
                =
                (['""])
                (?<value>.*?)
                \2
            )*
        \s*/?>
    ", RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);

foreach(Match m in regex.Matches(input))
{
    var names = m.Groups["name"];
    var values = m.Groups["value"];

    for(int i = 0; i < names.Captures.Count; i++)
    {
        Console.WriteLine("Name = {0} Value = {1}",
                names.Captures[i].Value, values.Captures[i].Value);
    }
}

对于输入字符串,如:

  

blah blah&lt; input name =“hi”value =“world”test ='foo'/&gt;等等等等

这将输出:

  

名称=名称值= hi
  名称=值值=世界
  Name = test Value = foo

它不处理name=value(即没有围绕值的引号),但这不应该太难添加支持。