Выдирание куска строки

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Выдирание куска строки

Сообщение NeverGone » 29.12.2007 (Сб) 10:10

Извиняюсь за дурацкий вопрос, но...
В общем суть:
имеется в файле такая строка (в начале 8 пробелов)
" window.location='http://www.***.com';"
Какими командами VB из нее можно выдрать только http://www.***.com?
Чувствую, что нужно пользовать Left\Right, но и тут проблема: у меня в проге длина http://www.***.com может меняться юзером!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.12.2007 (Сб) 10:12

Зацени InStr.
Lasciate ogni speranza, voi ch'entrate.

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Сообщение NeverGone » 29.12.2007 (Сб) 10:24

все равно остается проблема. В начале строки может быть и 4 пробела, и тогда InStr найдет совсем не то! Или я неправильно понял?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.12.2007 (Сб) 10:25

Неправильно.
Почитай описание функции.
Lasciate ogni speranza, voi ch'entrate.

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Сообщение NeverGone » 29.12.2007 (Сб) 10:40

получилось получить номер символа. Но все равно, как выдрать адрес?
Туплю...
Последний раз редактировалось NeverGone 05.09.2008 (Пт) 14:03, всего редактировалось 1 раз.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 29.12.2007 (Сб) 10:47

Наводящий вопрос.
У каждой такой строки в которой содержится адрес есть какой либо завершающий символ одинаковый для всех таких строк?
Утро добрым не бывает!

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 29.12.2007 (Сб) 10:52

Создай форму и на ней Text1.Text
Попробуй введи туда адрес с пробелами. :wink:
Код: Выделить всё
'Запрет ввода определенных символов с буфера обмена.

Private Sub Text1_Change()
Dim selst As Long, selln As Long
With Text1
    selst = .SelStart
    selln = .SelLength
    .Text = Replace(.Text, " ", "")
    .SelLength = selln
    .SelStart = selst
End With
End Sub
Главное, ребята, сердцем не стареть...

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Сообщение NeverGone » 29.12.2007 (Сб) 11:00

спасибо, с пробелами разобрался.
но как убрать window.location=' и '; в конце?

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 29.12.2007 (Сб) 11:05

Вариант с InStr, на форму Text1 и Command1

Код: Выделить всё
Private Sub Command1_Click()
Dim b As Long
Dim e As Long
Dim tmp As String

tmp = Text1.Text

b = InStr(1, tmp, "=")
If b = 0 Then Exit Sub
b = b + 1
e = InStr(b, tmp, ";")
If e = 0 Then Exit Sub
tmp = Mid$(tmp, b, e - b)
tmp = Replace(tmp, "'", "")
tmp = Trim$(tmp)

MsgBox tmp
End Sub
Последний раз редактировалось HiSER 29.12.2007 (Сб) 11:28, всего редактировалось 2 раз(а).

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 29.12.2007 (Сб) 11:19

Попробуй так:
Код: Выделить всё
Private Sub Text1_Change()
Dim selst As Long, selln As Long
With Text1
    selst = .SelStart
    selln = .SelLength
    .Text = Replace(.Text, "window.location", "")
    .Text = Replace(.Text, "=", "")
    .Text = Replace(.Text, "'", "")
    .Text = Replace(.Text, ";", "")
    .Text = Replace(.Text, "?", "")
    .SelLength = selln
    .SelStart = selst
End With
End Sub

Правда ковычки не знаю как убрать. :(
Главное, ребята, сердцем не стареть...

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 29.12.2007 (Сб) 12:40

Saturn.65 писал(а):Правда ковычки не знаю как убрать.

Код: Выделить всё
Replace (Text1.text, """","")

Кажется так
Утро добрым не бывает!

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 29.12.2007 (Сб) 13:08

gjghjc писал(а):
Код: Выделить всё
Replace (Text1.text, """","")

Кажется так

Точно. Я пробовал " ставить, ошибку выдавало.
Главное, ребята, сердцем не стареть...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 29.12.2007 (Сб) 14:16

NeverGone
я бы сделал так:

Код: Выделить всё
Dim sLink As String
sLink = Mid("myString", InStr("myString;", "='") + 1)
sLink = Left(sLink, InStrRev(sLink, ";") - 2)

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 29.12.2007 (Сб) 14:45

А я бы сделал универсальнее :)
Код: Выделить всё

Dim myRegExp As New RegExp ' создаём экземпляр RegExp'a
myRegExp.MultiLine = True ' текст многострочный
myRegExp.Global = True ' будем проходить всю строку
myRegExp.IgnoreCase = True ' игнорируем регистр символов
myRegExp.Pattern = "(window.location=')(.*?)(')" ' маска

Dim aMatch As Match ' один из совпавших образцов
Dim colMatches As MatchCollection ' коллекция этих образцов
Dim testString As String ' тестируемая строка

Set colMatches = myRegExp.Execute(Text1.Text) ' запускаем
For Each aMatch In colMatches ' проходим по всей коллекции
    List1.AddItem aMatch.SubMatches(1)
Next aMatch


P.S. Не забудьте в ссылках подключить Microsoft VBScript Regular Expressions.
Salus populi suprema lex

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.12.2007 (Сб) 17:16

Я бы сделал так:
Код: Выделить всё
url = Split(MyHardString, "'")(1)

Если скорость не критична (ну, вообще, я бы так конечно не сделал)

или так:
Код: Выделить всё
Dim lUrlStartPos        As Long
lUrlStartPos = instr(1, MyHardString, "'")+1
url = Mid$(MyHardString, lUrlStartPos, Instrrev(MyHardString, "'")-lUrlStartPos)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Сообщение NeverGone » 29.12.2007 (Сб) 21:00

удалено...
Последний раз редактировалось NeverGone 05.09.2008 (Пт) 14:04, всего редактировалось 2 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.12.2007 (Сб) 21:01

NeverGone
Его код просто ужасен.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 30.12.2007 (Вс) 0:25

Хакер
во-во..., точно
...подростки, что поделаешь :D

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 30.12.2007 (Вс) 1:39

Наскока я понял его код работает. Это главное при такой постановке задачи. То есть автору не требуется оптимизация по скорости, по размеру кода, главное результат. Следовательно при такой постановке задачи его код является решением, каким бы он ужасным ни был. Другое дело, что эта постановка подразумевает множество вариантов решения. Но тут уже выбор за автором.
Последний раз редактировалось Lumen 30.12.2007 (Вс) 1:45, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 1:44

А, хм... Дело в том, что его не не то чтобы не оптимизирован по скорости. Предложенный мною вариант (оба) тоже не оптимизированны по скорости.

Дело в том что его вариант просто до невозможности крив. Это всё равно что для того, чтобы посчитать сложночит x + y писать такой код:

Код: Выделить всё
Dim i as long
Select Case X
     case is > 0
         for i  = 1 to x
                 z = z +1
         next i
      case is < 0
         for i = -1 to x step -1
             z = z - 1
         next i
end select
Select Case y
     case is > 0
         for i  = 1 to y
                 z = z +1
         next i
      case is < 0
         for i = -1 to y step -1
             z = z - 1
         next i
end select

Вместо такого:
Код: Выделить всё
z = x + y
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 30.12.2007 (Вс) 18:45

Там и не было написано, что это идеальный код <_<
Был написан на скорую руку и выдвинут всего лишь как вариант.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 18:56

Судя потому, что Хисеру особый респект, имеено его код был выбран автором темы. А раз так, не лишним было бы предупредить автора, что этот выбор наихудший из всех возможных в пределах данного топика.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Сообщение NeverGone » 30.12.2007 (Вс) 22:57

Снова протупил... у Хакера код в 16 раз короче... Извините, виноват... Правда, размер экзешника как был 48 Кб, так и остался...
Всем спасибо.
Последний раз редактировалось NeverGone 05.09.2008 (Пт) 14:06, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 23:05

NeverGone
Размер экзешника меняется рывками.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Сообщение NeverGone » 30.12.2007 (Вс) 23:08

Хакер писал(а):NeverGone
Размер экзешника меняется рывками.

простите, это как?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 23:15

EXE файл является PE-файлом. PE-файл устроен так, что состоит из:
1) Заголовка (служебной структуры, в которой хранятся основные данные). Заголовков несколько.
2) Таблицы секцией (служебной таблице, в которой содержится информация о секциях).
3) Идущих подряд секций.

Секция - это (в общем случае) - область файла (например все данные с 5000-ного по 6000-ный байт), которая обладает одними характеристиками.

При загрузке PE-файла все секции переносятся в память. Для того, чтобы совершить это как можно быстрее - размер секции окргуляется до некоторой большой величины (например для 4 килобайт).
Поэтому, что программа состоящая из одного байта кода, что программа состоящая из 300 байт кода - обе будут после компиляции весить чуть больше 4 кб (но, во всяком случае, одинаково).

Вместо 4 кб в принципе может быть любое число - зависит от настроек компилятора. VB округляет до 1 кб. Округление всегда производится в большую сторону.

Т.е. 1 байт, 300 байт, 1000 байт всегда округлятся до 1024 байт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Сообщение NeverGone » 30.12.2007 (Вс) 23:24

Разобрался, спасибо.
Пожалуйста, закройте тему.
Последний раз редактировалось NeverGone 05.09.2008 (Пт) 14:09, всего редактировалось 2 раз(а).

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 31.12.2007 (Пн) 2:57

Можно пакером воспользоваться. UPX'ом например.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.12.2007 (Пн) 3:05

Lumen
http://bbs.vbstreets.ru/viewtopic.php?t=28535 (найди в тексте UPX)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 31.12.2007 (Пн) 3:26

Зачем? Ты мне хочешь рассказать что такое UPX? Или может быть как он работает?

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 62

    TopList