2010-05-28 75 views
2

在你说“哦不,不是再次”之前,我要说明我的情况。我正在解析HTML输出的一部分,我唯一感兴趣的是每个<input/>标记的namevalue属性。 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但不幸的是,这是不是这样

+0

我不了解你,但*“问题是,我不知道属性的顺序或数量”*在我的世界中是否足以使用DOM解析器。 – 2010-05-28 09:02:01

+0

我在没有内置解析器的平台上,我不想带外部解析器 – Bostone 2010-05-28 16:33:57

回答

2

要获得namevalue值到同一个捕获组,不论顺序,你可以尝试

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

如果您正则表达式实现支持向前看符号。 这假设值是引用的。

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

对于输入字符串等:

等等等等<输入名称= “hi” 值= “世界” 测试= '富'/ >等等等等

这将输出:

名称=名义值=喜
名称=值值=世界
名称=测试值= foo的

它不处理name=value(即没有引用价值),但不应该太难以添加支持。

相关问题