Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Снова регулярные выражения!


Автор: JaguarSmith 8.12.2005, 22:55
В кратце - задача которая передо мной стоит сводится к тому чтоб скачать страничку с сайта взять оттуда всё, что в теге <body> выкинуть от туда все скрипты и переформатировать в соответствии со своей таблицей стилей. Решил сделать через регулярные выражения а заодно и разобраться с ними. Т.к. <body> довольно сложный тег он может быть <body> а может быть и <BODY class="body" bottomMargin="0" leftMargin="0" topMargin="0" onload="javascript:Start_Up();" rightMargin="0"> решил начать с более простого тега <head> smile

Код

        ' HTML_text - переменная в которую загружается страничка с сайта...
        Dim _Head as string
        Dim hd As New Regex("<(head|HEAD)(.)*/(head|HEAD)>", RegexOptions.Multiline)
        Dim head_m As Match = hd.Match(HTML_text.Replace(Chr(13), "").Replace(Chr(10), ""))

        If head_m.Success Then
            _Head = head_m.Groups.Item(0).Captures.Item(0).Value
        End If


smile
1) Здесь приходится выкидывать символы перевода сторки (HTML_text.Replace(Chr(13), "").Replace(Chr(10), "")) иначе выражение не работает как можно от этого уйти?
2)Оказалось что выражения чуствительны к регистру поэтому приходится делать такую штуку (head|HEAD) как можно это написать более корректно(например <Head> - пойман не будет)?

Ps. Пишу в этот раздел а не в ASP.NET потому что вопрос связан скорее с бейсиком а не с работой сервера и серверными примочками...

Автор: Exception 9.12.2005, 00:30
Имхо, для таких целей лучше использовать специализированные парсеры. Но тогда док должен быть валидным.. что бывает не всегда.

Автор: JaguarSmith 9.12.2005, 00:46
Какие парсеры? Где про них можно прочитать/скачать? 8 )

Я вот про них ничего не знаю и работаю с тем что есть - тоесть пишу парсер сам. smile

Да и с регулярными выражовываниями хочется разобраться...


Автор: Exception 9.12.2005, 00:56
Ну, например парсер из System.Xml. Но он должен читать только xhtml.

Автор: rapa 9.12.2005, 01:28
Но какоы бы он (тэг <Body>) ни был сложным,мне кажется,что всё что тебе понадобится,находится внутри, т.е. между тэгами <Body> и </Body>.Значит,ты таки можешь построить регуларное выражение по этому принципу.
Начало: "^\<Body\>"
Конец: "\<\/Body\>$"

Автор: Дрон 9.12.2005, 01:38
JaguarSmith
Для начала вместо того, чтобы писать head|HEAD -- просто поставь опцию IgnoreCase smile

Код

Dim hd As New Regex("<head(.)*/head>", RegexOptions.Multiline Or RegexOptions.IgnoreCase)


Я бы ещё посоветовал добавлять опцию Compiled -- тогда всё работать будет чуть быстрее.
Добавлено @ 01:40
Цитата(JaguarSmith @ 8.12.2005, 22:55)
Здесь приходится выкидывать символы перевода сторки

И опять же. Попробуй поставить опцию Singleline.

Почитал бы MSDN -- там много полезного про регулярные выражения написано.

Автор: JaguarSmith 9.12.2005, 03:22
Цитата

Почитал бы MSDN -- там много полезного про регулярные выражения написано.

Да я и читал - но там слишком много всего написано и не очень понятно если не знать с чего начать smile
По этому пришлось на осчупь - мне главно понять как оно используется в принципе а потом можно уже и МСДН читать...

Спасибо большое - очень ценная инфа...

Я бы никогда не догадался про "RegexOptions.Multiline Or RegexOptions.IgnoreCase"... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)