bobbydigital
Active Member
Предполагам, че много колеги сте се сблъсквали с проблема дублирано съдържание, особенно когато в сайта има съдържание което е попъплва от потребители и особенно ако става въпрос за сайтове за обяви да кажем. Предлагам едно решение което може да реши този проблем.
Теорията е следната когато се публикува нещо му се създава хаш, после се пуска скрипт който открива редове от базата с еднакъв хаш и ги изтрива, така се елиминират дубликатите.
Това са две функции който генерират уникален хаш на даден текст.
За да може винаги хаша да еднакъв дори и потребителя да слага точки или спейсове или тирета или нещо си, за да заблуди системата функцията прави следното:
1. прави целия текст с малки букви
2. заменя \r\n (нов ред) с <br />
3. премахнва всички тагове от текста
4. премахва всички символи които не са буква или цифра
5. сортира текста
по този начин си осигуряване винаги еднакъв хаш
това е кода на двете функции
разбира се функциите могат да се сложат в някакъв util клас за да е по удобно.
После при публикуване на дадено съдържание, в базата се записва този хаш.
След това се пуска крон, който на определено време изтрива съдържанието с еднакъв хаш
В моят случай на laravel в сайт за обяви кода изглежда така:
Като цяло идеята е ясна, прави се хаш, изтриват се дубликатите.
Поздрави
Теорията е следната когато се публикува нещо му се създава хаш, после се пуска скрипт който открива редове от базата с еднакъв хаш и ги изтрива, така се елиминират дубликатите.
Това са две функции който генерират уникален хаш на даден текст.
За да може винаги хаша да еднакъв дори и потребителя да слага точки или спейсове или тирета или нещо си, за да заблуди системата функцията прави следното:
1. прави целия текст с малки букви
2. заменя \r\n (нов ред) с <br />
3. премахнва всички тагове от текста
4. премахва всички символи които не са буква или цифра
5. сортира текста
по този начин си осигуряване винаги еднакъв хаш
това е кода на двете функции
Код:
function generateDescriptionHash($_description)
{
$_description = mb_strtolower($_description);
$_description = nl2br($_description);
$_description = strip_tags($_description);
$_description = preg_replace('/[^\pL\pN]+/u', '', $_description);
$_description = sortString($_description);
return md5($_description);
}
function sortString($_string)
{
$sort = [];
for($i=0;$i<strlen($_string);$i++){
$sort[$i] = mb_substr($_string,$i , 1, 'UTF-8');
}
sort($sort);
return implode($sort);
}
разбира се функциите могат да се сложат в някакъв util клас за да е по удобно.
После при публикуване на дадено съдържание, в базата се записва този хаш.
След това се пуска крон, който на определено време изтрива съдържанието с еднакъв хаш
В моят случай на laravel в сайт за обяви кода изглежда така:
Код:
$doubleAds = Ad::select('ad_id')
->groupBy('ad_description_hash')
->havingRaw('count(ad_id) >= 2')
->get()
->toArray();
if(!empty($doubleAds)){
$inArray = [];
foreach($doubleAds as $k => $v){
$inArray[] = $v['ad_id'];
}
Ad::whereIn('ad_id', $inArray)->delete();
}
Като цяло идеята е ясна, прави се хаш, изтриват се дубликатите.
Поздрави