在你说“哦不,不再”之前,我在说明我的情况。我正在解析部分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"/>
。
是否有一个正则表达式能够以可预测的顺序获得name
和value
属性的值?如果我认为name
属性总是在value
之前,我就不会问这个问题,但不幸的是情况并非如此
答案 0 :(得分:2)
要将name
和value
的值放入同一个捕获组中,无论顺序如何,都可以尝试
<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
(即没有围绕值的引号),但这不应该太难添加支持。