Страница 1 из 1

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

СообщениеДобавлено: 15.03.2016 15:14:51
azsx
Задача, есть переменная, в ней уже спарсенна веб страница. Я хочу выделить из нее все домены и поддомены, в том числе и национального написания доменов. Ну и вывести их куда нибудь, например в массив. Важно, мне нужны все url, не только в <a href="url"
Нет ли готовой процедуры у кого нибудь?
---------
не нашл, написал.

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

СообщениеДобавлено: 17.03.2016 12:10:02
Kitayets
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

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

СообщениеДобавлено: 17.03.2016 15:05:34
azsx
правильно ли я перевел отсюда, что пакет старый, не поддерживается и ваще не доступен для скачивания?
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

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

СообщениеДобавлено: 17.03.2016 15:18:52
Дож
azsx, перевели правильно, но про regexpr от Florian. Вам нужен regexpr от Sorokin, который является нормальным работающим пакетом.

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

СообщениеДобавлено: 17.03.2016 15:43:11
azsx
огромное спасибо, недоперевел (недопонял сразу). Работающий пакет, оказывается лежит сразу в лазарус /lazarus/components/synedit/
Возникает иная загадка. Как мне в regexpr реализовать выборку национальных доменов? Ну вот типа .ไทย (тайланд).

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

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

Я бы ещё на вашем месте ещё предварительно проверил, что паскалевский regexpr корректно обратабывает \p{L} и поддерживает модификатор u.

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

СообщениеДобавлено: 17.03.2016 16:41:49
azsx
сложно утверждать наврняка, но судя по всему не работает :(

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