Помогите по «регуляркам» и функциям даты и времени

Discussion in 'PHP' started by valind, 25 Feb 2013.

  1. valind

    valind New Member

    Joined:
    18 Nov 2011
    Messages:
    32
    Likes Received:
    3
    Reputations:
    0
    Всем привет. Нужна помощь!

    Не могу понять, чё да как делать. Сложилась такая ситуация, нужно допилить регулярки и функции даты и времени. А именно:
    1. На странице отображается входящее сообщение, которое подгружено с базы. Указывается отправитель и нужно скрыть последние несколько (3-4) знаков под «Х». Ну типа, было «Bobik007», а стало «BobiXXXX»
    2. Преобразование текста в ссылку. Да, согласен, в нэте - фигова туча примеров, но у меня ничего не получилось. Вставлял разные регулярки, в разные места – нефурычит.
    3. Что и куда нужно вписать, что бы отображалось сколько времени прошло с момента получения сообщения на сервак? А то, на данный момент, отображается время сервака (Нью-Йоркское время), в которое получена записюлька, а это неудобно.

    Вот код странички:
    PHP:
    <?php
    // Отключаем возможные предупреждения
    if (version_compare(phpversion(), "5.3.0"">=")  == 1)
      
    error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
    else
      
    error_reporting(E_ALL & ~E_NOTICE); 

    require_once(
    'CMySQL.php'); // для работы с базой данных


    // Получаем последние записи
    function getLastRecords($iLimit 3) {
        
    $sRecords '';
        
    $aRecords $GLOBALS['MySQL']->getAll("SELECT * FROM `receive_001` ORDER BY `id` DESC LIMIT {$iLimit}");
        foreach (
    $aRecords as $i => $aInfo) {
            
    $sWhen date($aInfo['when']);
            
    $sRecords .= <<<EOF
            <div class="record" id="{$aInfo['id']}">
        <div id="otpravitel">
    {$aInfo['ot_kogo']}</div>
        <div id="kogka">
    {$sWhen}</div>
        <div id="pustota"></div>
        <div id="soderganie">
    {$aInfo['message']}</div>
    </div>
    EOF;
        }
        return 
    $sRecords;
    }

    if (
    $_GET) { // Принимаем новые записи

        
    $ot_kogo $GLOBALS['MySQL']->escape(strip_tags($_GET['ot_kogo']));            // от кого получено
        
    $komu $GLOBALS['MySQL']->escape(strip_tags($_GET['komu']));                // кому адресовано
        
    $message $GLOBALS['MySQL']->escape(strip_tags($_GET['message']));            // текст сообщения
        
                // Можно добавлять комментарий
                
    $GLOBALS['MySQL']->res("INSERT INTO `receive_001` SET `ot_kogo` = '{$ot_kogo}', `komu` = '{$komu}', `message` = '{$message}', `when` = UNIX_TIMESTAMP()");

                
    // Выводим последние 10 записей
                
    $sOut getLastRecords(10);
                echo 
    $sOut;
                exit;

        echo 
    1;
        exit;
    }

    // Выводим последние 10 записей
    $sRecords getLastRecords(10);

    ob_start();
    ?>
    <div class="container" id="records">
        <div id="col1"><h2>Принимаем сообщения</h2><br>
            <div id="records_list"><?= $sRecords ?></div>
        </div>
    </div>
    <?
    $sGuestbookBlock = ob_get_clean();
    ?>
    <!DOCTYPE html>
    <html lang="ru" >
        <head>
            <meta charset="utf-8" />
            <title>Принимаем сообщения</title>
            <link href="main.css" rel="stylesheet" type="text/css" />
            <!--[if lt IE 9]>
              <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
            <![endif]-->
        </head>
        <body>
            <?= $sGuestbookBlock ?>
            <footer><br><h2>Сообщенице</h2></footer>
        </body>
    </html>
    ПС Пожалуйста, помогите недалёкому и убогому! :rolleyes: И если не затруднит, то напишите, в какую строчку, то или иное, нужно вставить.
    У меня, правда, ещё есть вопрос по базе, но его чуть позже. Хоть бы с этим разобраться. :D
     
    #1 valind, 25 Feb 2013
    Last edited: 26 Feb 2013
  2. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,857
    Likes Received:
    1,961
    Reputations:
    594
    Ну с первым совсем просто, отрезаем слева от строки нужное количество символов и добавлям звёздочки:

    PHP:
    <?php
    $strdata
    ="Пример";
    echo 
    substr($strdata3)."***";    // возвращает "При***"
    ?>
    По второму уточните ТЗ ибо ссылка (URL) в своей сущности это и есть текстовая строка определённого формата.

    3. Ну время получения сообщения логично записывать в базу если оно нужно.
     
    #2 -=lebed=-, 25 Feb 2013
    Last edited: 25 Feb 2013
  3. valind

    valind New Member

    Joined:
    18 Nov 2011
    Messages:
    32
    Likes Received:
    3
    Reputations:
    0
    Для пробы, ничего не меняя, воткнул Ваш код в начало своей php-страницы. Мне выдало «�имер***», подумал, что проблемы с кодировкой, хотя кириллицу у меня отображает нормально. Ладно, фиг с ним, экспериментирую дальше. Слово «Пример» изменил на «123456» и мне вывело «456***» - оба, а это вообще не то пальто. :D
    Может подскажете, что не так, и в какую строку моего кода нужно вставлять? Потому что, этот код, после изменения на мою переменную - никакого результата не даёт, ничего не прячется за звёздачки.
    Допустим, текст сообщения выглядит таким образом: «Zdorov, posmotri na moj sait domen.ru»
    Да, нужно и я его записываю в базу, и оно выводится на странице, при просмотре сообщения. Только загвоздка заключается в том, что время отображается таким образом: «February 25, 2013 03:42:17 EET». А хотелось бы вот так: «получено 30 секунд назад» или «получено 15 минут назад».
     
    #3 valind, 26 Feb 2013
    Last edited: 26 Feb 2013
  4. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,857
    Likes Received:
    1,961
    Reputations:
    594
    Угу, там ошибка была:
    PHP:
    <?php 
    $strdata
    ="Пример"
    echo 
    substr($strdata03)."***";    // возвращает "При***" 
    ?>
    (http://php.su/functions/?f=substr&choice=info)

    По второму это называется выделить URL, либо отпарсить, полно готовых регулярок есть в интернете, как с http:// так и без него, нужно просто поискать и велосипед изобретать незачем, потом добавить html-тэги для преобразования его в полноценную кликабельную ссылку.

    Ну если тебе разницу во времени надо считать, то и получай разницу между текущим и тем что в базе, в базу естественно надо писать не в текстовом виде, а чтобы поле имело специальный тип дата/время, над ним доступны арифметические операции (вычитание, сложение и т.д.). Читаешь из базы вычитаешь его из текущего - получаешь разницу.

    Заходи на php.su и найдёшь все нужные тебе функции.
     
    #4 -=lebed=-, 26 Feb 2013
    Last edited: 26 Feb 2013
    1 person likes this.
  5. valind

    valind New Member

    Joined:
    18 Nov 2011
    Messages:
    32
    Likes Received:
    3
    Reputations:
    0
    Спасибо, конечно за советы! Но то, что мне было необходимо - так и осталось за кадром. Самое главное, как всю эту х**ню влепить в мой код?! Что б оно у меня работало, а не просто в качестве примера, на левой странице с другим кодом!

    Относительно URL, я чуть выше уже писал, что находил в нете готовые регулярки, вставлял в свой код - НЕ РАБОТАЕТ! Куда конкретно надо вставить, что изменить в моём коде?

    Дата и время. Да, я это понимаю, что от настоящего времени нужно отнять время прибытия. В мою базу вносится это значение: 1361758625 (Количество секунд, прошедших с начала Эпохи Unix), а не в текстовом виде. И функцию нашёл, но как её всавить в мой код, чтоб эта падла работала?!
    PHP:
    function time_elapsed_B($secs){
        
    $bit = array(
            
    ' year'        => $secs 31556926 12,
            
    ' week'        => $secs 604800 52,
            
    ' day'        => $secs 86400 7,
            
    ' hour'        => $secs 3600 24,
            
    ' minute'    => $secs 60 60,
            
    ' second'    => $secs 60
            
    );
           
        foreach(
    $bit as $k => $v){
            if(
    $v 1)$ret[] = $v $k 's';
            if(
    $v == 1)$ret[] = $v $k;
            }
        
    array_splice($retcount($ret)-10'and');
        
    $ret[] = 'ago.';
       
        return 
    join(' '$ret);
        }
     
       
    $nowtime time();
    $oldtime '1361758625';
    echo 
    "&nbsp;time_elapsed_B: ".time_elapsed_B($nowtime-$oldtime). "<br>\n";
    Посмотрите на мой код, что и как в нём изменить, что вставить или вырезать?
     
  6. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,857
    Likes Received:
    1,961
    Reputations:
    594
    .time_elapsed_B($nowtime-$oldtime).


    PHP:
    function time_elapsed_B($secs){
        
    $bit = array(
            
    ' year'        => $secs 31556926 12,
            
    ' week'        => $secs 604800 52,
            
    ' day'        => $secs 86400 7,
            
    ' hour'        => $secs 3600 24,
            
    ' minute'    => $secs 60 60,
            
    ' second'    => $secs 60
            
    );
           
        foreach(
    $bit as $k => $v){
            if(
    $v 1)$ret[] = $v $k 's';
            if(
    $v == 1)$ret[] = $v $k;
            }
        
    array_splice($retcount($ret)-10'and');
        
    $ret[] = 'ago.';
       
        return 
    join(' '$ret);
        }
     
    $oldtime '1361758625';
    echo 
    "разница:".time_elapsed_B(time()-$oldtime);
    Функция просто осуществляет перевод в нормальный символьный вид из секунд в дату и время. Ну и в чём проблема? Достал время сообщения из базы, взял текущее, получил разницу и подал на вход функции. На выходе получил разницу в символьном нормальном виде (дата, время). Откуда я знаю где у тебя в базе, в какой таблице и каком поле хранится время записи? Доставай запросом его сначала сам.
     
    #6 -=lebed=-, 26 Feb 2013
    Last edited: 26 Feb 2013
  7. valind

    valind New Member

    Joined:
    18 Nov 2011
    Messages:
    32
    Likes Received:
    3
    Reputations:
    0
    -=lebed=-, отписал Вам в личку
     
  8. valind

    valind New Member

    Joined:
    18 Nov 2011
    Messages:
    32
    Likes Received:
    3
    Reputations:
    0
    А свой код в первом посте я для чего показываю? Что бы меня носом ткнули в конкретную строку, что бы сказали конкретно - куда нужно эту фигню вставить. Где нужно дописать дополнительные скобки (или ещё что-нибудь), потому что синтаксис помялся.

    Update!
    В общем, ИКСики появились :D Дописал одну строчку, смотреть на пятую по счёту:
    PHP:
    function getLastRecords($iLimit 3) {
        
    $sRecords '';
        
    $aRecords $GLOBALS['MySQL']->getAll("SELECT * FROM `receive_001` ORDER BY `id` DESC LIMIT {$iLimit}");
        foreach (
    $aRecords as $i => $aInfo) {
            
    $aInfo['ot_kogo'] = substr($aInfo['ot_kogo'], 0mb_strlen($aInfo['ot_kogo'], 'UTF-8')-4).'XXXХ';
            
    $sWhen date('F j, Y H:i:s T'$aInfo['when']);
            
    $sRecords .= <<<EOF
    <div class="record" id="{$aInfo['id']}">
        <div id="otpravitel">
    {$aInfo['ot_kogo']}</div>
        <div id="kogka">
    {$sWhen}</div>
        <div id="pustota"></div>
        <div id="soderganie">
    {$aInfo['message']}</div>
    </div>
    EOF;
        }
        return 
    $sRecords;
    }
    Но с кириллицей всё равно не дружит "Ва�XXXХ". Но это и не важно, т.к. всегда будет отображаться то ли латиница, толи цыфры.
    Теперь нужно разобраться с отображением даты и времени.
     
    #8 valind, 26 Feb 2013
    Last edited: 27 Feb 2013
Loading...