Задать вопрос
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
  • Вопрос задан
  • 362 просмотра
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 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, в реальности гораздо больше моментов надо учитывать, так что не стесняйтесь дорабатывать код под свои нужды.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы