Dark Wizard
Гуру форума
- Регистрация
- 23 Сен 2007
- Сообщения
- 194
- Реакции
- 80
- Автор темы
- #1
Собственно, есть идея прятать id пользователя в тексте - чтобы текст, скопированный пользователям незаметно содержал его id (это позволит определить, кто скопировал текст на другой ресурс, например).
Как прятать?
Замена русских букв на английские (а, о, е, с, р, х, у). На 850 символов текста в среднем получается 160 замен - достаточно чтобы прятать 5-6 значные id с дублированием даже в небольших абзацах.
В чём смысл?
Есть пользователь с id "123". Берём текст и массив букв для замены. Заменяем в тексте первую букву из массива один раз (1), потом замену пропускаем, затем делаем две замены (2), одну пропускаем, три замены (3), пропускаем 2 (в примере 3), потом повторяем сначала.
Пример
Текст:
В лесу родилась елочка,
В лесу она росла,
Зимой и летом стройная,
зеленая была.
Замена (добавил пробелы для наглядности) :
В л e с y p о д и л а c ь ё л o ч к а,
В л е с y о н a p о c л a,
З и м o й и л e т о м с т p o й н a я,
З е л ё н а я б ы л a
Жирным обозначены замены, подчёркиванием - буквы которые специально не заменяли. Таким образом мы спрятали два раза число 123 в четырёх строках.
В этой теме я хочу обсудить наилучший алгоритм и решить некоторые проблемы кодирования.
В идеале получить 2 функции - которая прячет число в тексте, и которая получает из обработанного текста число. Наверное можно ограничиться пропуском одной замены для цифры, и двух для разделения. Также думаю лучше сначала заменить все русские буквы на английские, а потом прятать в русских буквах - будет незаметней.
Примерный набросок:
Осталась проблема в определении русских/английских букв: $text[$i] для русской буквы выдаёт кракозябру. Как можно изменить? Возможно можно реализовать как-то всё по-другому?
Как прятать?
Замена русских букв на английские (а, о, е, с, р, х, у). На 850 символов текста в среднем получается 160 замен - достаточно чтобы прятать 5-6 значные id с дублированием даже в небольших абзацах.
В чём смысл?
Есть пользователь с id "123". Берём текст и массив букв для замены. Заменяем в тексте первую букву из массива один раз (1), потом замену пропускаем, затем делаем две замены (2), одну пропускаем, три замены (3), пропускаем 2 (в примере 3), потом повторяем сначала.
Пример
Текст:
В лесу родилась елочка,
В лесу она росла,
Зимой и летом стройная,
зеленая была.
Замена (добавил пробелы для наглядности) :
В л e с y p о д и л а c ь ё л o ч к а,
В л е с y о н a p о c л a,
З и м o й и л e т о м с т p o й н a я,
З е л ё н а я б ы л a
Жирным обозначены замены, подчёркиванием - буквы которые специально не заменяли. Таким образом мы спрятали два раза число 123 в четырёх строках.
В этой теме я хочу обсудить наилучший алгоритм и решить некоторые проблемы кодирования.
В идеале получить 2 функции - которая прячет число в тексте, и которая получает из обработанного текста число. Наверное можно ограничиться пропуском одной замены для цифры, и двух для разделения. Также думаю лучше сначала заменить все русские буквы на английские, а потом прятать в русских буквах - будет незаметней.
Примерный набросок:
PHP:
$text = 'В лесу родилась ёлочка, В лесу она росла';
$id = '123';
//для работы без ошибок меняем во всём тексте русские буквы на английские
//меняю русские буквы на английские
$text = str_replace('а', 'a', $text);
$text = str_replace('о', 'o', $text);
$text = str_replace('е', 'e', $text);
$text = str_replace('с', 'c', $text);
$text = str_replace('р', 'p', $text);
$text = str_replace('х', 'x', $text);
$text = str_replace('у', 'y', $text);
function rletter($l){ //меняю английские на русские (в финальной версии без скобок)
if ($l == 'a'){return '[а]';}
if ($l == 'o'){return '[о]';}
if ($l == 'e'){return '[е]';}
if ($l == 'c'){return '[с]';}
if ($l == 'p'){return '[р]';}
if ($l == 'x'){return '[х]';}
if ($l == 'y'){return '[у]';}
}
function encode($text, $id){
$arr = array('a', 'o', 'e', 'c', 'p', 'x', 'y'); //массив английских букв для замены
$idlen = strlen($pid); //длина id
$skip = 0; //для пропуска
echo '[start]<br>';
for ($i = 0; $i < strlen($text); $i++){ //перебираем весь текст по буквам
for ($num = 0; $num < $idlen; $num++){ //перебираем кол-во символов в id
for ($d = 0; $d < intval($pid[$num]); $d++){ //делаем кол-во замен для каждого символа, соответствующее его значению (т.е. две замены для символа 2, например)
if (in_array($text[$i], $arr)){ //если буква входит в массив
if ($skip == 0){
$rtext .= rletter($text[$i]); //здесь замена русской буквы на английскую
if ($d == intval($pid[$num])){$skip--;} //пропускаем следующую замену
}
}else{$rtext .= $text[$i];} //не меняем другие буквы
$i++;
} $skip = 1; //следующий символ
} $skip = 2; //повторно прячем id
}
echo '<br>[end]';
}
echo '<hr>';
echo encode($text, $pid);
echo '<hr>';
echo 'num: '.$i;
echo '<br>'.strlen($text);
?>
Осталась проблема в определении русских/английских букв: $text[$i] для русской буквы выдаёт кракозябру. Как можно изменить? Возможно можно реализовать как-то всё по-другому?
Последнее редактирование: