Перейти к контенту
  • 0

Какая пакость убирает первый пробел в теге CODE ?


Song

Вопрос

Форум по программингу, приходится часто постить код программы. первый пробел обрезается! Уже весь post_parser.php перерыл.

Помогите плиз. Может кто это исправил уже?

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0
Проверяй каким текст приходит в regex_code_tag. Дело в том что IBP на входе уже парсит текст и заменяет чать опасных символов на безопасный эквивалент.
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Ну и чем же опасен пробел?

Так вот как бы его проверить-то... :D

Это не среда, что протрассировать код можно ;)

Ссылка на комментарий
Поделиться на других сайтах

  • 0

test

         //--------------------------------------
        // Add in the smilies box
        //--------------------------------------
        
        $show_table = 0;
        $count      = 0;
        $smilies    = "<tr align='center'>\n";
        
        // Get the smilies from the DB
        
        $DB->query("SELECT * FROM ibf_emoticons WHERE clickable='1'");
        
        while ($elmo = $DB->fetch_row() )
        {
        
            $show_table++;
            $count++;
            
            $smilies .= "<td><a href=\"javascript:emoticon('".$elmo['typed']."')\"><img src=\"".$ibforums->vars['EMOTICONS_URL']."/".$elmo['image']."\" alt='smilie' border='0'></a> </td>\n";
            
            if ($count == $ibforums->vars['emo_per_row']) {
                $smilies .= "</tr>\n\n<tr align='center'>";
                $count = 0;
            }
        }

and so

    if (!($permissions['adminpermissions'] & CANCONTROLPANEL))
    {
        if ($vboptions['maxreputationperday'] >= $vboptions['reputationrepeat'])
        {
            $klimit = ($vboptions['maxreputationperday'] + 1);
        }
        else
        {
            $klimit = ($vboptions['reputationrepeat'] + 1);
        }
        $checks = $DB_site->query("
            SELECT userid,dateline
            FROM " . TABLE_PREFIX . "reputation
            WHERE whoadded = $bbuserinfo[userid]
            ORDER BY dateline DESC
            LIMIT 0,$klimit
        ");

        $i = 0;
        while ($check = $DB_site->fetch_array($checks))
        {
            if (($i < $vboptions['reputationrepeat']) AND ($check['userid'] == $userid))
            {
                eval(print_standard_error('error_reputationsameuser'));
            }
            if ($i == $vboptions['maxreputationperday'] AND (($check['dateline'] + 86400) > TIMENOW))
            {
                eval(print_standard_error('error_reputationtoomany'));

            }
            $i++;
        }
    }

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Vanish

дело в том, что у тебя здесь не один пробел а много.

Т.е. два и больше уже отображатся, а вот один - режется! :D

Пожалуйста демонстрация:

 Здесь на самом деле перед словом "Здесь" один пробел

  А здесь два пробела -  проблем нет

Как видно, здесь тот же глюк ;)

Изменено пользователем Song
Ссылка на комментарий
Поделиться на других сайтах

  • 0

в post_parser после $txt = preg_replace( "#\s{2}#", "  ", $txt );

добавить $txt = preg_replace( "#\s#", " ", $txt );

 

а можно вообще заменить

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Song

все страдаете =) http://forum.sources.ru/index.php?showtopic=40458

 

Такс по порядку:

1. Куда пропадает символ пробела. Он пропадает благодаря браузерам, ну или спецификации HTML (я там не был, врать не стану). Если перед символом пробела нет никаких печатаемых символов, то они отбрасываются.

Вот пример хтмл кода:

<html>
<head></head>
<body>
<br> 121212
<br>  1212121
<br>   1212121
</body>
</html>

в действии тут

Если же мы хотим что бы пробелы выводились, то не зря сделан спецсимвол -  

Вот пример хтмл кода:

<html>
<head></head>
<body>
<br> 121212
<br>  1212121
<br>   1212121
</body>
</html>

в действии тут

 

2. Что делать если мы стремимся уменьшить трафик. А именно не хотим что бы вместо 1-го символа ("чистый" пробел) было шесть символов (пробел  ). Так как по выше изложенным причинам (см. пункт 1) получается что без   не обойтись. Но выясняется, что связка  +' ' работает на ура, давая результат два пробела, но не в 12 символов, а всего в 7.

 

3. Как реализовать программно?

Все просто заменим все "чистые" пробелы на  -пробел

$txt = preg_replace( "#\s#"     , " ", $txt );

А дальше пологаясь на выводы пункта 2, заменяем каждые два  -пробела на связку  +' '

$txt = preg_replace( "#( ){2}#" , "  ", $txt );

 

4. Но и этого мало, перечитав еще раз пункт 1 и посмотрев решение 3 приходим к выводу, что и это решение не эффективно в плане сбережения трафика. Так как у нас "чистые" пробелы окруженные текстом, оказываются замененными на  -пробел. Тем самым выиграв 5 символов в одном месте мы теряем гораздо больше в других местах. Значит решение 3 хоть и дает результат, но оно не оптимально.

 

5. Наконец то оптимальное решение:

Если мы самый первый "чистый" пробел строки заменим на  -пробел, а каждый два "чистых" пробела на связку  +' ', то получим именно то к чему стремились.

Собственно код:

Заменяем все "чистые" пробелы, в начале строки, на  -пробелы

$txt = preg_replace( "#^\s#" , " ", $txt );

При переводе строки, форум заменяет символы возврата каретки \r и перевода строки \n на <br>, следовательно первого условия явно не достаточно, поэтому добавим следующее:

$txt = str_replace( "<br> " , "<br> ", $txt);

Ну и наконец каждые два "чистых" пробела на связку:

$txt = preg_replace( "#\s{2}#"  , "  ", $txt );

 

Вот и вся любовь.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Vanish

Спасибо, Vanish, напишу что наконец получилось :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Song

$txt = preg_replace( "#<br />\s#" , "<br> ", $txt );

лол. "Ратую за уменьшение трафика, а на скорость мне вобщем то плевать".

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.