代码之家  ›  专栏  ›  技术社区  ›  Bostone

从输入标记中获取名称和值

  •  2
  • Bostone  · 技术社区  · 14 年前

    在你说“哦,不,不要再来了”之前,我先说明一下我的情况。我正在分析HTML输出的一部分,我唯一感兴趣的是 name 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"/> .

    有没有一个正则表达式可以得到 名称 价值 属性是否按可预测的顺序?如果我能假设的话,我就不会问这个问题了 名称 属性总是在前面 价值 但不幸的是事实并非如此

    2 回复  |  直到 9 年前
        1
  •  2
  •   Jens    14 年前

    获取的值 name value 在同一个捕获组中,无论顺序如何,您都可以尝试

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

    如果regex实现支持lookaheads。 这假设引用这些值。

        2
  •  0
  •   Dean Harding    14 年前

    下面是使用.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<input name=“hi”value=“world”test='foo'/gt;blah blah

    这将输出:

    名称=名称值=高
    名称=值值=世界
    名称=测试值=foo

    它不能处理 name=value (即价值周围没有引号)但这不应该太难增加支持。