Задать вопрос
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
  • Вопрос задан
  • 371 просмотр
Подписаться 1 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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, в реальности гораздо больше моментов надо учитывать, так что не стесняйтесь дорабатывать код под свои нужды.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽