LINUX.ORG.RU

qt5 регулярка

 


0

2

Есть HTML страничка и её надо спарсить:


            <form method="post" action="">
                <input type="hidden" name="csrf_token" value="eebf1643b2febfdbd141fb9b58c48706" />
                <div class="lf_title">Логин или E-Mail</div>
                <div class="lf_field">
                    <input type="text" name="login" id="login_field" tabindex="1"/> <a href="/registration" class="lf_link">Регистрация</a>
                </div>
                <div class="lf_title">Пароль</div>
                <div class="lf_field">
                    <input type="password" name="pass" id="pass_field" tabindex="2"/> <a href="/passremind.html" class="lf_link">Забыли пароль?</a>
                </div>
                                <table border="0" cellpadding="0" cellspacing="0" width="100%">
                    <tr>
                        <td width="20"><input type="checkbox" name="remember" value="1" checked="checked" id="remember" tabindex="3" /></td>
                        <td>
                            <label for="remember">Запомнить меня</label>
                        </td>
                    </tr>
                </table>
                <p class="lf_submit">
                    <input type="submit" name="login_btn" value="Войти" tabindex="4" />
                </p>
            </form>

Мне нужно только hidden поле оттуда. Написал регулярку: name=«csrf_token» value=\"(\w{32})\" Дальше:

    QRegExp rx("name=\"csrf_token=" value=\"(\w{32})\"");
    QStringList result = rx.capturedTexts();
    qDebug() << rx.indexIn(html);

Говорит нету...куда копать?

★★★

Ну во-первых даже лоркод высвечивает незаэскейпленную кавычку. И равно там не надо. Вообще как оно у тебя компилируется? Вот что внутри кавычек должно быть:

name=\"csrf_token\" value=\"(\w{32})\"

А во-вторых что если я, например, понаставлю пробелов между именами аттрибутов и значениями?

asaw ★★★★★ ()
Ответ на: комментарий от kir64

Гораздо лучше так:

name\s*=\s*\"csrf_token\"\s+value\s*=\s*\"(\w{32})\"
И у тебя нет capturing group (уже есть :).

asaw ★★★★★ ()
Последнее исправление: asaw (всего исправлений: 1)
Ответ на: комментарий от kir64

Он ещё забыл заэскейпить сам обратный слэш.

asaw ★★★★★ ()

Надо же, кути не только сам о себе уродлив, там и регулярки уродливые. В нормальном языке это типа /<\s*input.*hidden[^>]+>/

dkstra ()
Ответ на: комментарий от dkstra

У тебя регулярные выражения зависят от языка?

kir64 ★★ ()

Парсить HTML регэкспами в 2015 году должно быть стыдно.

Deleted ()
Ответ на: комментарий от kir64

Ну реализации различаются. Я просто глянул, у ТС'а куча лапши, подумал, что регулярки там убогие. Никто же в треде нормального варианта не привел. Стало быть, так оно и есть. Мой вариант работает там?

dkstra ()
Ответ на: комментарий от dkstra

Я просто глянул, у ТС'а куча лапши, подумал, что регулярки там убогие

QRegExp is modeled on Perl's regexp language

anonymous ()

В итоге

QRegExp rx(«name=\„csrf_token\“ value=\»(\\w+)\"");

chapay ★★★ ()
Ответ на: комментарий от dkstra

А с чего ты взял что твой вариант вообще представляет какую-то практическую ценность в контексте вопроса ТСа?

asaw ★★★★★ ()
Ответ на: комментарий от asaw

Ну, исходя из этого

Мне нужно только hidden поле оттуда

, очевидно

dkstra ()
Ответ на: комментарий от dkstra

Ты на код посмотри и подумай что ТС'у нужно.

asaw ★★★★★ ()
Ответ на: комментарий от asaw

Да мне насрать на этот обезьяний код. Пусть формулирует внятно. Он написал

Есть HTML страничка и её надо спарсить:

Мне нужно только hidden поле оттуда. Написал регулярку:

Говорит нету.

dkstra ()
Ответ на: комментарий от dkstra

Всем кроме тебя тут понятно, что нужно ТСу. Подумай над этим, если сможешь.

kir64 ★★ ()
Ответ на: комментарий от dkstra

Вот про тебя правильно выше написали. Я бы это ещё и ТСу адресовал :)

asaw ★★★★★ ()
Ответ на: комментарий от asaw

Ну так что тсу нужно? Достать поле с hidden, а потом достать из него value? Или чо?

Че же ты раз умный такой, не помог ему в этой «трудной» задаче?

dkstra ()
Ответ на: комментарий от dkstra

Надо же, кути не только сам о себе уродлив, там и регулярки уродливые.

Этот Qt-хейтер прилюдно обосрался в треде, вносите другого!

EXL ★★★★★ ()
Ответ на: комментарий от emulek

ещё лучше вместо \w юзать [[:xdigit:]]

А что, там не может быть символов v, z, h и т.д?

dkstra ()
Ответ на: комментарий от dkstra

Че же ты раз умный такой, не помог ему в этой «трудной» задаче?

ты только меня с собой не путай.

asaw ★★★★★ ()
Ответ на: комментарий от asaw

Я повторюсь

Да мне насрать на этот обезьяний код

Я не пытался помочь тсу, я просто говорю в уродской среде всегда уродские решения. На которые мне срать.

dkstra ()
Ответ на: комментарий от dkstra

Ты просто обосрался и всё. Регулярные выражения в Qt не хуже других. А более красивое решение подсказали qt5 регулярка (комментарий) просто у тебя, как и с регулярными выражениями, руки печатают буквы быстрее, чем голова успевает понимать что тебе пишут.

asaw ★★★★★ ()
Ответ на: комментарий от invy

Ещё один, покусанный stackoverflow, что же ты, болезный используешь чтобы разово вытащить <body>уныло</body> информацию из корректного заранее известного HTML?

zolden ★★★★★ ()
Ответ на: комментарий от amazpyel

Не за что! С той целью и выложил, чтоб сперва ручками проверяли, а уж если совсем беда - на форум.

kir64 ★★ ()
Ответ на: комментарий от dkstra

судя по всему это md5sum, там не может быть больше f.

вот если как принято в ed2k записывать sha, то может. Но в Linux принято и там использовать [[:xdigit:]].

emulek ()
Ответ на: комментарий от zolden

1. Не stackoverflow, а вуз и информатика. (нельзя парсить контекстно-свободные языки конечными автоматами). На стэковерфлоу просто красиво написано.
2. «вытащить <body>уныло</body>» имеет мало общего с «парсить». И да, regex и для вытащить плохо подходит. Для того, чтобы работало гарантировано нужен нормальный парсер, dom и xpath.

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

нельзя парсить контекстно-свободные языки конечными автоматами

Ну дык, если контексто свободные нельзя, наверное, контексто-зависимые и подавно нельзя? тогда вообще ниаккие нельзя получается?

dkstra ()
Ответ на: комментарий от invy

нельзя парсить контекстно-свободные языки конечными автоматами

Всем в общем то п***й.) главное чтоб работало.

TDrive ★★★★★ ()
Ответ на: комментарий от invy

2. «вытащить <body>уныло</body>» имеет мало общего с «парсить».

как тогда это называть?

TDrive ★★★★★ ()
Ответ на: комментарий от TDrive

Именно так и есть - работает. Я ж на свой сайт захожу :)

chapay ★★★ ()
Ответ на: комментарий от invy

Ну вот так и назвать - «вытащить».

де факто все это называют парсить, это уже устоялось и меняться не собирается, а на сколько это правильно - тема обсуждения для задротов.

TDrive ★★★★★ ()
Ответ на: комментарий от invy

Я сейчас пытаюсь это все переварить. Насколько я понял из определения, любой нерегулярный язык является подмножеством своего собрата — регулярного языка. То есть берем алфавит abc — из него мы можем «родить» один большой регулярный и множество нерегулярных. Любое выражение нерегулярного языка будет входить в регулярный язык. То есть, регулярный язык охватывает все возможные нерегулярные языки.

Так почему же регулярные выражения могут парсить регулярный язык, а его подмножество — не могут?

dkstra ()
Ответ на: комментарий от dkstra

Ты серьёзно?

Всё не так совершенно.

Языки подразделяются на типы (иерархия Хомского): регулярные (тип 3), контекстно-свободные (тип 2), контекстно-зависимые (тип 1), и рекурсивно перечисляемые (тип 0). Это просто иерархия. Как... с алкоголем. Есть слабо-алкогольные, крепкие...

Не надо смешивать это с алфавитом.

Над алфавитом T = {a, b, c} можно построить все виды языков. Регулярный L = {abc} (конечный, одно слово abc), или L = {a^nb^kc^j | n,k,j >= 0} (бесконечный, слова соответствующие рег. выражению a*b*c*), контекстно-свободный: L = {a^mb^m | m > 0} - язык содержащий слова ab aabb aaabbb, т.е. язык соответствующий скобкам (если заменить a и b на ( и ). Язык L = {a^nb^nc^n | n > 0} - контекстно-зависимый. Регулярных выражений (и соответствующих конечных автоматов) для разбора последних двух (контекстно-свободных/зависимых) не существует.

Нужно заметить, что имплементации регэкспов имеют некоторые «костыли», которые позволяют немного выйти за рамки «регулярности», но ограниченно (грубо говоря до определённой длины слов)/

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

Начнем с того, что термин формальные языки не соответствует термину «языки». Формальный язык — это просто множество строк над алфавитом. Итак, у нас множество строк. Теперь, вопрос стал четче. Допустим есть алфавит a b регулярный язык над ним есть: (не включая пустые) a b ab ba. вот это — наш регулярный язык. Теперь, выкинув любое из выражений, например, b, мы получаем нерегулярный язык. Очевидно, что любая подстрока регулярного языка содержится в регуярном языке.

dkstra ()
Ответ на: комментарий от invy

контекстно-свободных/зависимых) не существует.

Насколько я понял, контексто - зависимость/свободность — это не харрактеристика самого формального языка, а характеристика грамматики этого языка. ИМХО, тут имеет место быть смешивание теплого с мягким.

dkstra ()
Ответ на: комментарий от dkstra

множество строк

слов

Теперь, выкинув любое из выражений, например, b, мы получаем нерегулярный язык.

Нет. Это будет другой регулярный язчк L={a, ab, ba}.

Вообще множество регулярных языков замкнуто относительно: объединения, конкатенации, комплемента и пересечения (и ещё ряда операций). То есть, если у тебя L1 и L2 над алфавитом A регулярны, то L1L2. L1 ∪ L2, L1 ∩ L2, A*\L1 и A*\L2 тоже регулярны.

invy ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Взять сторонний HTML парсер. libxml2 какой-нибудь не умеет?

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.