В этой статье вы прочитаете по PHP библиотеку php-domain-parser или как её ещё называют PDP, для работы с URL, возможно для многих она будет полезна.
Также если вас интересуют другие PHP библиотеки, то возможно вам будет интересно почитать «Обзор PHP библиотеки Validation для валидации».
Установка библиотеки php-domain-parser:
Для установки как обычно нужно использовать composer, для этого напишите такую команду в терминале:
1 | composer require jeremykendall/php-domain-parser |
После этой вы сможете работать с этой библиотекой.
Работа с библиотекой php-domain-parser:
Тут стоит сказать, что вся эта статья по сути перевод, не большой части документации, которую вы найдёте на GitHub.
Разрешение доменов:
Эта библиотека может разрешать домен от:
В обоих случаях это делается с помощью метода разрешения, реализованного в экземпляре ресурса. Метод возвращает объект Pdp\ResolvedDomain
, представляющий результат этого процесса.
Для Public Suffix List вам необходимо использовать класс Pdp\Rules
, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 | use Pdp\Rules; use Pdp\Domain; $publicSuffixList = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $domain = Domain::fromIDNA2008('www.PreF.OkiNawA.jP'); $result = $publicSuffixList->resolve($domain); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->subDomain()->toString(); //display 'www'; echo $result->secondLevelDomain()->toString(); //display 'pref'; echo $result->registrableDomain()->toString(); //display 'pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'okinawa.jp'; $result->suffix()->isICANN(); //return true; |
Для списка доменов верхнего уровня IANA вместо этого используется класс Pdp\TopLevelDomains
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php use Pdp\Domain; use Pdp\TopLevelDomains; $topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); $domain = Domain::fromIDNA2008('www.PreF.OkiNawA.jP'); $result = $topLevelDomains->resolve($domain); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain()->toString(); //display 'okinawa'; echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; echo $result->subDomain()->toString(); //display 'www.pref'; echo $result->suffix()->isIANA(); //return true |
В случае ошибки генерируется исключение, которое расширяет Pdp\CannotProcessHost
.
Метод разрешения всегда будет возвращать ResolvedDomain
, даже если синтаксис домена неверен или если в данных ресурса не найдено совпадений. Чтобы обойти это ограничение, библиотека предоставляет более строгие методы, а именно:
Rules::getCookieDomain
Rules::getICANNDomain
Rules::getPrivateDomain
Для Public Suffix List и для списка доменов верхнего уровня следующий метод:
TopLevelDomains::getIANADomain
Эти методы разрешают домен относительно соответствующего источника данных, используя те же правила, что и метод resolve
, но вместо этого выдают исключение, если не найден действительный эффективный TLD
или если отправленный домен недействителен.
Все эти методы предполагают в качестве единственного аргумента реализующий объект Pdp\Host
, но другие типы (то есть: string
, null
и строковые объекты) поддерживаются с предопределенными условиями, как описано в оставшемся документе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php use Pdp\Domain; use Pdp\Rules; use Pdp\TopLevelDomains; $publicSuffixList = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $domain = Domain::fromIDNA2008('qfdsf.unknownTLD'); $publicSuffixList->getICANNDomain($domain); // will throw because `.unknownTLD` is not part of the ICANN section $result = $publicSuffixList->getCookieDomain($domain); $result->suffix()->value(); // returns 'unknownTLD' $result->suffix()->isKnown(); // returns false // will not throw because the domain syntax is correct. $publicSuffixList->getCookieDomain(Domain::fromIDNA2008('com')); // will not throw because the domain syntax is invalid (ie: does not support public suffix) $result = $publicSuffixList->resolve(Domain::fromIDNA2008('com')); $result->suffix()->value(); // returns null $result->suffix()->isKnown(); // returns false // will not throw but its public suffix value equal to NULL $topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); $topLevelDomains->getIANADomain(Domain::fromIDNA2008('com')); // will not throw because the domain syntax is invalid (ie: does not support public suffix) |
Чтобы создать экземпляр каждого преобразователя домена, вы можете использовать следующий именованный конструктор:
- fromString — Создать экземпляр преобразователя из встроенной строки, представляющей источник данных;
- fromPath — Создайте экземпляр распознавателя по локальному пути или онлайн-URL, полагаясь на
fopen
;
Если создание экземпляра не работает, будет выброшено исключение.
ПРЕДУПРЕЖДЕНИЕ:
Вы никогда не должны разрешать доменное имя таким образом в рабочей среде, по крайней мере, без механизма кэширования для уменьшения количества загрузок PSL.
Использование Public Suffix List для определения того, какое доменное имя является действительным, а какое нет, опасно, особенно в наши дни, когда новые gTLDs появляются быстрыми темпами.
Если вы хотите узнать действительность домена верхнего уровня, «IANA Top Level Domain List» является подходящим источником для этой информации или, в качестве альтернативы, рассмотрите возможность использования непосредственно DNS.
Если вам необходимо использовать эту библиотеку для какой-либо из вышеперечисленных целей, рассмотрите возможность интеграции механизма обновления в ваше программное обеспечение.
Вывод:
В этой статье вы прочитали про PHP библиотеку php-domain-parser или как её ещё называют PDP для работы с URL, надеюсь вам было интересно и полезно, а если нужно больше, то читайте официальную документацию.