Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > адреса URL из текста


Автор: WapCel 6.1.2010, 20:45
нужно копировать адреса url из текста (AnsiString) в TStringlist


borland c++ 6 builder )

Please help me... 

Автор: artsb 6.1.2010, 20:49
Код

TStringList *lst = new TStringList();
AnsiString str;
// ...
lst->Add("i am url");
// or
lst->Add(str);
// ...
delete lst;

Автор: WapCel 6.1.2010, 20:53
Например

Код

<html>
<body>

<div class="body">
<b>
» <a href="index.php?action=Routes&amp;sid=9ecmj3ngjvs7nl2ohnn3k1k127">Rutele microbuzelor</a><br/>
» <a href="index.php?action=SendMail&amp;sid=9ecmj3ngjvs7nl2ohnn3k1k127">Expediere E-mail</a><br/>
» <a href="index.php?action=Feedback&amp;sid=9ecmj3ngjvs7nl2ohnn3k1k127">Feedback</a><br/>
</b>
</div>

<a href="http://vingrad.ru">Super site!</a><br/>
<a href="/index.php">Na glavnuju</a><br/>
<a href="/forum">Forum</a><br/>

</body>
</html>


Результат:
  •  index.php?action=Routes&amp;sid=9ecmj3ngjvs7nl2ohnn3k1k127
  •  index.php?action=SendMail&amp;sid=9ecmj3ngjvs7nl2ohnn3k1k127
  •  index.php?action=Feedback&amp;sid=9ecmj3ngjvs7nl2ohnn3k1k127
  •  http://vingrad.ru
  •  /index.php
  •  /forum

Автор: WapCel 6.1.2010, 21:24
PHP example:


Код

preg_match_all
("/<[Aa][ \r\n\t]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/",
$page_text, $urls_array);

Автор: artsb 6.1.2010, 21:55
Так... Начинают раскрываться карты.
WapCel, вы подробно распишите что вам нужно.

Автор: WapCel 6.1.2010, 23:38
вывести со страницы адреса URL

Автор: artsb 6.1.2010, 23:50
А что у вас конкретно не получается? Вытащить их из текста?

Автор: WapCel 6.1.2010, 23:52
Yes sir  smile 
Как это сделать?
Please help me..

Автор: artsb 7.1.2010, 00:47
Накатал функцию:
Код

unsigned GetURLs(TStrings *source, TStrings *dest) {
AnsiString asText = source->Text;
unsigned uiPos, uiCount = 0;
char cQuote;
while(uiPos = asText.Pos("href")) {
 asText = asText.Delete(1, uiPos + 3);
 while(asText[1] == ' ')
  asText = asText.Delete(1, 1);
 if(asText[1] != '=')
  continue;
 do
  asText = asText.Delete(1, 1);
 while(asText[1] == ' ');
 if(asText[1] != '"' && asText[1] != '\'')
  continue;
 cQuote = asText[1];
 uiPos = 2;
 while(asText[uiPos] != cQuote || asText[uiPos - 1] == '\\')
  uiPos++;
 dest->Add(asText.SubString(2, uiPos - 2));
 asText = asText.Delete(1, uiPos);
 uiCount++;
}
return uiCount;
}

Автор: WapCel 7.1.2010, 01:28
A Big Thanks To You!

Автор: WapCel 7.1.2010, 01:52
Не работает..

[C++ Warning] Unit1.cpp(17): W8060 Possibly incorrect assignment (Но это ничего)

Вот ошибка при вызове функции (image)

Автор: artsb 7.1.2010, 10:59
WapCel, как вы используете? Я проверял так: разместил на форме 2 Мемо. В первое поместил текст страницы приведённый вами выше, потом повесил на кнопку обработчик с кодом:
Код

Caption = IntToStr(GetURLs(Memo1->Lines, Memo2->Lines));

После нажатия кнопки, в кептион формы занеслось "6" и во втором Мемо появилось шесть адресов. Всё ОК.

Добавлено через 8 минут и 6 секунд
Пример:

Автор: xvr 7.1.2010, 12:49
Не корысти ради, а токмо правды для - URL могут идти не только за href  smile  . Советую взять исходники wget и оторвать оттуда функцию, которая парсит закаченные HTML страницы в поисках URL (используется для рекурсивной закачки HTML страниц)

Автор: artsb 7.1.2010, 13:04
Цитата(xvr @  7.1.2010,  12:49 Найти цитируемый пост)
URL могут идти не только за href

Эт понятно smile Но человек привёл пример того что ему нужно. Я и написал такую функцию.

Автор: WapCel 7.1.2010, 14:24
Спасибо.  smile   smile 

Автор: WapCel 7.1.2010, 14:54
Код

/* Say no:  "[C++ Warning] Unit1.cpp(17): W8060 Possibly incorrect assignment" :D  */
while((uiPos = asText.Pos("href")) != NULL) {

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