NibiruanChild
@NibiruanChild

Как быстро сравнить две разные ссылки на одинаковый адрес без curl?

При добавлении новой ссылки в БД, мне надо проверить, возможно она уже есть в базе. Беда в том, что клиент может ввести одну и ту же ссылку огромным числом способов.

Покажу на примере:
http://www.ecco-shoes.ru/
http://www.ecco-shoes.ru
http://ecco-shoes.ru/
https://www.ecco-shoes.ru/
www.ecco-shoes.ru/
ecco-shoes.ru
http://www.ecco-shoes.ru/?
http://www.ecco-shoes.ru/#
http://www.ecco-shoes.ru/index.php

итп...

На глаз очевидно, что это ссылки на одну и ту же страницу (да да, я знаю, что на самом деле это не так и все они могут открывать разные страницы, но в 99% это так, а для меня погрешность 1% допустима).

Делать запросы curlom очень накладно, особенно если сервер по ссылке тормозит (а указать можно любую ссылку). Как можно быстро сравнить ссылки хотя бы с погрешностью на одинаковость.

PHP + PDO:MySQL
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 3
@malbaron
Приводить ссылку к каноническому виду.
Ответ написан
Комментировать
IvanCher
@IvanCher
Мысли шире
Можешь попробовать приводить все входящие данные url к одному виду(canonical) и хранить этот вид в базе в отдельной колонке.
Допустим, сперва определяешь сколько уровней домена.
ecco.ru - 2 уровня (ecco и ru),
men.ecco.ru - 3 (men, ecco, ru),
www.men.ecco.ru - 4 (www, men, ecco, ru)
Сделать это можно как-то так:
$urls = "www.ecco-shoes.ru
www.ecco-shoes.ru
http://ecco-shoes.ru
https://www.ecco-shoes.ru/
www.ecco-shoes.ru/
ecco-shoes.ru
www.ecco-shoes.ru/?
www.ecco-shoes.ru/#
www.ecco-shoes.ru/index.php";

$urls = explode("\n", $urls);

foreach ($urls as $url) {
	$hostname = parse_url($url, PHP_URL_HOST);
	$domains = explode('.', $hostname);
	
	echo $url."<br/>";
	echo $hostname."<br/>";
	
	foreach ($domains as $domain) {
		echo $domain."<br/>";
	}
	
	echo "<br/><br/>";
}

Затем конструируешь из этих частей урла нужный вид, например игнорируя www, и сохраняешь это в базе в доп. колонке. Желательно все эти части привести к одному регистру, допустим к нижнему.

И всё, затем проверяешь был ли уже такой урл простым запросом в бд по колонке с каноничным урлом.
Ответ написан
Комментировать
glebovgin
@glebovgin
Full Stack Web Developer
Либо пишите в базу уже канонические урлы.
Либо пишите, что вводит юзер, но потом тщательно проверяете.
Пример:
$url = strpos($url, "//") === false ? '//' . $url : $url; // если указана схема http или https
$url = str_replace('www.', '', $url);  // если можете пренебречь www
$host = parse_url($url, PHP_URL_HOST); // получаете чистый хост


На выходе получите в $host чистый ecco-shoes.ru (либо men.ecco-shoes.ru, например).
Дальше SQL
SELECT * FROM `table_name` WHERE url LIKE "%ecco-shoes.ru%"

Получите все варианты записей с этим хостом в каком бы он страшном и неканоническом виде ни был записан.

НО! Я лишь сделал проверку на http(s) и www, в реальности гораздо больше моментов надо учитывать, так что не стесняйтесь дорабатывать код под свои нужды.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы