2010-05-28 17 views
2

Прежде чем вы скажете «о нет, не снова», здесь я заявляю о своем случае. Я разбираю часть вывода 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

Я не знаю о вас, но * «Проблема в том, что я не знаю порядка или количества атрибутов» * в моем мире было бы достаточной причиной для использования парсера DOM. –

+0

Я на платформе, в которой нет встроенного анализатора, и я не хочу приносить внешний – Bostone

ответ

2

Чтобы получить значения name и value в ту же группу захвата, независимо от того, вы можете попробовать

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

если ваша реализация регулярных выражений поддерживает lookaheads. Это предполагает, что значения указаны.

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

Для входа строка, как:

бла-бла-< введите название = "привет" значение = "мир" тест = 'Foo'/> бла-бла

Это Выведет:

Name = Имя Значение = привет
Name = значение Значение = мир
Name = тест Значение = Foo

Он не обрабатывает name=value (т.е. нет котировок вокруг значения), но это не должно быть слишком сложно, чтобы добавить поддержку.

Смежные вопросы