Спрятать число в тексте

все зависит от того, кто будет создавать и редактировать тексты.
если только админ - можно придумать какой-нибудь плагин и работу с тегами как вы выше написали. а если тексты создаются и редактируются пользователями - вы потеряете контроль над содержимым
 
Для просмотра ссылки Войди или Зарегистрируйся, вопрос о том, кто будет создавать/редактировать, не стоит. Есть готовый текст, хотелось бы модифицировать код lag-a, чтобы функция не обрабатывала в этом тексте часть в бб коде [noencode], например. Я администратор форума, и у меня есть несколько тем, в которых нужна возможность копирования дословного (например, название игрового предмета). Разумеется, сам бб код будут знать только пара человек.
 
ну а в чем проблема? прописал теги, а дальше писать код который будет обрабатывать простой текст и будет пропускать текст внутри тегов [noencode]
 
ну а в чем проблема? прописал теги, а дальше писать код который будет обрабатывать простой текст и будет пропускать текст внутри тегов [noencode]
Этот форум называется "Как сделать?". Вероятно у меня затруднения в написании кода?

Функция использует регулярные выражения, в которых я пока плохо разбираюсь, и не представляю, как его нужно изменить, чтобы не обрабатывало текст в определённых bb кодах (можно даже только функцию кодирования).
 
вариантов решения может быть много. можно с помощью функции strpos() вычислять места начала и окончания тегов и по позициям производить обработку
но strpos() и т.п. отдают только первое вхождение подстроки, тогда придется в цикле после каждого вхождения прогонять снова...

вот другой вариант: с помощью регулярок найдем все теги [noencode], временно заменим их какой-нибудь спец.строкой, обработаем русские буквы, и потом обратно подстроки поменяем на текст с тегами
PHP:
preg_match_all('#\[noencode\].*?\[/noencode\]#si', $text_topics, $matches);
foreach($matches[0] as $tag) {
     $text_topics = str_replace($tag, '__TEMP_STR_NOT_REPLACE__', $text_topics, 1);
}

//далее производим манипуляции с текстом из которого вырезаны теги [noencode]
....
//конец манипуляций

//теперь возвращаем теги назад:
foreach($matches[0] as $tag) {
     $text_topics = str_replace('__TEMP_STR_NOT_REPLACE__', $tag, $text_topics, 1);
}
примерно так. извиняюсь за возможные ошибки
а вообще... сколько программистов. столько и решений задач. так что просьба камнями не кидаться
 
PHP:
// Размер id в битах
define('BITS_PER_ID', 16);
// Разделитель
define('BITS_PREFIX', '1010101010101011');

// массив заменяемых букв
// ключами массива являются русские буквы
// английские в качестве значений
$replace = array('а'=>'a', 'о'=>'o', 'е'=>'e', 'с'=>'c', 'р'=>'p', 'х'=>'x', 'у'=>'y');



function encode($text, $replace, $id)
{
    // Переводим id в двоичную сиcтему и добавляем разделитель
    $mask = BITS_PREFIX.sprintf('%0'.BITS_PER_ID.'b', $id);

    $rus = implode(array_keys($replace));
    $regex = "~[$rus](?:(?=[а-яё])|(?<=[а-яё].)(?<=[^$rus].))~u";

    return preg_replace_callback(
        $regex, function ($m) use ($replace, $mask) {
            static $i = 0;
            strlen($mask) > $i || $i = 0;
            return $mask[$i++] ? $replace[$m[0]] : $m[0];
        }, $text
    );
}



function decode($text, $replace)
{
    $rus = implode(array_keys($replace));
    $eng = implode(array_values($replace));
    $regex = "~[$rus](?:(?=[$eng]*[а-яё])|(?<=[а-яё].)(?<=[^$rus].))";
    $regex .= "|[$eng](?:(?=[$eng]*[а-яё])|(?<=[а-яё].))~u";
    preg_match_all($regex, $text, $matches);
    $raw = '';
    foreach ($matches[0] as $m) {
        $raw .= isset($replace[$m]) ? '0' : '1';
    }
    // Необработанная бинарная строка
    $r['raw_data'] = $raw;
   
    // Делим на части начиная с первого вхождения BITS_PREFIX
    $r['binary'] = str_split(strstr($raw, BITS_PREFIX), BITS_PER_ID + strlen(BITS_PREFIX));
   
    // Удаляем BITS_PREFIX и переводим результат из двоичной в десятичную систему счисления
    $r['decimal'] = array_map('bindec', substr_replace($r['binary'], '', 0, strlen(BITS_PREFIX)));
    return $r;
}



// исходный текст
$text = '';
$id = 123;

$enc = encode($text, $replace, $id);
$dec = decode($enc, $replace);

echo "<hr>\n", $enc, "\n<hr>\n";
echo "<pre>", print_r($dec, 1), "</pre>";

Текстовую стеганографию можно реализовать не только заменяя русские буквы на похожие английские, но и подменяя пробел обычный на неразрывный пробел, который в UTF-8 кодируется двумя байтами 0xC2 0xA0.
PHP:
// Размер id в битах
define('BITS_PER_ID', 16);
// Разделитель
define('BITS_PREFIX', '1010101010101011');


function encode($text, $id)
{
    // Переводим id в двоичную сиcтему и добавляем разделитель
    $mask = BITS_PREFIX.sprintf('%0'.BITS_PER_ID.'b', $id);
   
    // Обычный и неразрывный пробелы
    $replace = array(" ", "\xC2\xA0");
    $text = str_replace("\xC2\xA0", " ", $text);
   
    $mask = str_split($mask);
    return preg_replace_callback(
        "/ /", function ($m) use ($replace, $mask) {
            static $i = 0;
            count($mask) > $i || $i = 0;
            return $replace[$mask[$i++]];
        }, $text
    );
}

function decode($text)
{
    preg_match_all("~[ \xC2\xA0]~u", $text, $matches);
    $replace = array(" " => 0, "\xC2\xA0" => 1);
    $raw = '';
    foreach ($matches[0] as $m) {
        $raw .= $replace[$m];
    }
    // Необработанная бинарная строка
    $r['raw_data'] = $raw;
   
    // Делим на части начиная с первого вхождения BITS_PREFIX
    $r['binary'] = str_split(strstr($raw, BITS_PREFIX), BITS_PER_ID + strlen(BITS_PREFIX));
   
    // Удаляем BITS_PREFIX и переводим результат из двоичной в десятичную систему счисления
    $r['decimal'] = array_map('bindec', substr_replace($r['binary'], '', 0, strlen(BITS_PREFIX)));
    return $r;
}

// исходный текст
$text = '';
$id = 123;

$enc = encode($text, $id);
$dec = decode($enc);

echo "<hr>\n", $enc, "\n<hr>\n";
echo "<pre>", print_r($dec, 1), "</pre>";
 
Текстовую стеганографию можно реализовать не только заменяя русские буквы на похожие английские, но и подменяя пробел обычный на неразрывный пробел, который в UTF-8 кодируется двумя байтами 0xC2 0xA0.
В коде-то работает, но при попытке скопировать браузер автоматом заменяет на обычный пробел. Вероятно потому что неразрывный пробел - это только указание браузеру как отображать, а при копировании в буфере обмена сохраняется обычный пробел. Так что смысл теряется.
 
denverkurt, у меня почему-то не грузится, если в функции str_replace ставлю четвёртым параметром единицу, без неё работает, но всё заменяет на первое вхождение...
 
Назад
Сверху