Решено: Парсинг всех урл с переменной

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Решено: Парсинг всех урл с переменной

Сообщение azsx » 15.03.2016 15:14:51

Задача, есть переменная, в ней уже спарсенна веб страница. Я хочу выделить из нее все домены и поддомены, в том числе и национального написания доменов. Ну и вывести их куда нибудь, например в массив. Важно, мне нужны все url, не только в <a href="url"
Нет ли готовой процедуры у кого нибудь?
---------
не нашл, написал.
Последний раз редактировалось azsx 02.07.2016 12:02:29, всего редактировалось 1 раз.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Парсинг всех урл с переменной

Сообщение Kitayets » 17.03.2016 12:10:02

TRegExp + само регулярное выражение найди в гугле.

вот так примерно:

goole.com -> "регулярное выражение для url"

Добавлено спустя 1 минуту 39 секунд:
вот такое предлагают (>:-0)

Код: Выделить всё
/(https?:\/\/)?(www\.)?([-а-яa-zёЁцушщхъфырэчстью0-9_\.]{2,}\.)(рф|[a-z]{2,6})((\/[-а-яёЁцушщхъфырэчстьюa-z0-9_]{1,})?\/?([a-z0-9_-]{2,}\.[a-z]{2,6})?(\?[a-z0-9_]{2,}=[-0-9]{1,})?((\&[a-z0-9_]{2,}=[-0-9]{1,}){1,})?)/i
Kitayets
постоялец
 
Сообщения: 169
Зарегистрирован: 05.05.2010 21:15:24

Re: Парсинг всех урл с переменной

Сообщение azsx » 17.03.2016 15:05:34

правильно ли я перевел отсюда, что пакет старый, не поддерживается и ваще не доступен для скачивания?
This is the oldest implementation. It is present in packages/regexpr/src/old and is not currently compiled by the makefiles, so it is not available precompiled by default in released FPC/Lazarus versions.

http://wiki.freepascal.org/Regexpr
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Парсинг всех урл с переменной

Сообщение Дож » 17.03.2016 15:18:52

azsx, перевели правильно, но про regexpr от Florian. Вам нужен regexpr от Sorokin, который является нормальным работающим пакетом.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Парсинг всех урл с переменной

Сообщение azsx » 17.03.2016 15:43:11

огромное спасибо, недоперевел (недопонял сразу). Работающий пакет, оказывается лежит сразу в лазарус /lazarus/components/synedit/
Возникает иная загадка. Как мне в regexpr реализовать выборку национальных доменов? Ну вот типа .ไทย (тайланд).
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Парсинг всех урл с переменной

Сообщение Дож » 17.03.2016 15:52:33

Нужно корректно обрабатывать юникодные символы. Вот тут
http://stackoverflow.com/questions/4983 ... n-pcre-php
рекомендуют использовать \p{L} для юникодной буквы в регулярке с включённым модификатором u.

Я бы ещё на вашем месте ещё предварительно проверил, что паскалевский regexpr корректно обратабывает \p{L} и поддерживает модификатор u.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Парсинг всех урл с переменной

Сообщение azsx » 17.03.2016 16:41:49

сложно утверждать наврняка, но судя по всему не работает :(
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Парсинг всех урл с переменной

Сообщение Дож » 17.03.2016 18:29:08

Тогда имеет смысл поискать либу, лучше поддерживающую pcre.

Вот здесь вроде полная обёртка есть:
http://www.regular-expressions.info/delphi.html

Добавлено спустя 1 час 34 минуты 51 секунду:
Я посмотрел на эту либу — не понравилась. Какая-то монструозная жуть с VLC, линковкой и windows only подходом.

Нашёл гораздо лучше:
http://renatomancuso.com/software/dpcre/dpcre.htm

\p{L} поддерживает:
Код: Выделить всё
uses
  pcre;

var
  F: File;
  Regex: IRegex;

procedure Test(const S: AnsiString);
var
  Res: AnsiString;
begin
  BlockWrite(F, S[1], Length(S));
  if Regex.IsMatch(S) then begin
    Res := ' matched' + #10;
  end else
    Res := ' does not matched' + #10;
  BlockWrite(F, Res[1], Length(Res));
end;

begin
  Close(output);
  Assign(F, '');
  Rewrite(F, 1);
  Regex := RegexCreate('.*\p{L}.*', [rcoUTF8]);
  Test('j');
  Test('й');
  Test('5');
  Test('ไ');
  Test('ท');
  Test('ย');
  Test('.');
  Test('-');
  Test('/');
end.


Код: Выделить всё
j matched
й matched
5 does not matched
ไ matched
ท matched
ย matched
. does not matched
- does not matched
/ does not matched
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Общее

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru