2010-05-28 74 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(即沒有引用價值),但不應該太難以添加支持。

相關問題