Получить имя и значение из входного тега - PullRequest
2 голосов
/ 28 мая 2010

Прежде чем вы скажете: "О, нет, не снова", здесь я излагаю свой случай. Я анализирую часть вывода 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, но, к сожалению, это не так

Ответы [ 2 ]

2 голосов
/ 28 мая 2010

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

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

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

0 голосов
/ 28 мая 2010

Вот решение с использованием синтаксиса регулярных выражений .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=value (то есть без кавычек вокруг значения), но это не должно быть слишком сложно, чтобы добавить поддержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...