Регулярное сопоставление тегов HTML-параметров, которые не выбраны, а также выбраны - PullRequest
3 голосов
/ 01 сентября 2010

Могут ли некоторые порекомендовать регулярное выражение для возврата значения, когда элемент выбран, а также не выбран, как показано ниже.

<option value="32_1002_ACCT1001" selected="selected">ACCT1001 -- Accounting 1a</option>
<option value="32_1002_ACCT1002">ACCT1002 -- Accounting 1b</option>

Мое регулярное выражение в настоящее время работает только для невыбранной опции, показанной ниже.

(<option value="([^"]+)">([^<]+)<\/option>)

EDIT:

Спасибо за отличные ответы, ребята, однако я должен был быть немного более подробным и конкретным.

Я использую его в шаблоне экрана-скребка следующим образом:

<option value="~@COURSE_ID@~">~@COURSE_CODE@~ -- ~@COURSE_NAME@~</option>

где ~ @ COURSE_ID @ ~ указывает следующий запрос регулярного выражения:

([^"]+)

Отлично работает для всех тегов опций, КРОМЕ первого выбранного, который уже выбран.

В данный момент я проверяю ваши предложения, но если кто-то захочет присоединиться к верному решению о пожаре, было бы замечательно.

Я действительно борюсь с этим, похоже, ничего не работает!

Ответы [ 3 ]

4 голосов
/ 01 сентября 2010

Во-первых, плохая идея использовать регулярные выражения для анализа HTML.Используйте какой-нибудь html-парсер.(Я устал от написания этого, но я просто поставил его в качестве первого предложения, поскольку люди, как правило, сразу понижают голос без этого утверждения :))

В любом случае, просто измените свое регулярное выражение, чтобы учесть все атрибуты, подобные этому

(<option[^>]*?>([^<]+)<\/option>)

Ну, я не говорю, что это оптимально, просто с минимальными изменениями к вашему

3 голосов
/ 01 сентября 2010

Я согласен с Коби, но если вы действительно хотите использовать регулярные выражения, вот решение в Perl:

#!/usr/bin/perl
use strict;
use warnings;

while (<DATA>) {
    print $_;
    if (/^(<option value="([^"]+).*?(?:selected="selected")?.*)$/) {
        print "match\t value=$2\n";
    } else {
        print "NOT match\n";
    }
}

__DATA__
<option value="32_1002_ACCT1001" selected="selected">ACCT1001 -- Accounting 1a</option>
<option value="32_1002_ACCT1002">ACCT1002 -- Accounting 1b</option>

вывод:

<option value="32_1002_ACCT1001" selected="selected">ACCT1001 -- Accounting 1a</option>
match    value=32_1002_ACCT1001
<option value="32_1002_ACCT1002">ACCT1002 -- Accounting 1b</option>
match    value=32_1002_ACCT1002
1 голос
/ 01 сентября 2010

Вот альтернативный способ загрузки этих значений в C # с использованием Html Agility Pack :

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://jsbin.com/unasu/");
HtmlNodeCollection options = doc.DocumentNode.SelectNodes("//option[@value]");
IEnumerable<string> values = options.Select(o => o.Attributes["value"].Value);

Загрузка локального файла для полноты выполняется с помощью:

HtmlDocument doc = new HtmlDocument();
doc.Load(@"c:\file.html");

Как ясно видно, это решение намного более надежно, чем регулярное выражение - оно не потерпит неудачу с большинством кода, не заботится о порядке атрибутов, форматах кавычек (одинарный двойной или ни одного) и многих, многихболее распространенные случаи.

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