Всем привет. Нужна помощь! Не могу понять, чё да как делать. Сложилась такая ситуация, нужно допилить регулярки и функции даты и времени. А именно: 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> ПС Пожалуйста, помогите недалёкому и убогому! И если не затруднит, то напишите, в какую строчку, то или иное, нужно вставить. У меня, правда, ещё есть вопрос по базе, но его чуть позже. Хоть бы с этим разобраться.
Ну с первым совсем просто, отрезаем слева от строки нужное количество символов и добавлям звёздочки: PHP: <?php $strdata="Пример"; echo substr($strdata, 3)."***"; // возвращает "При***" ?> По второму уточните ТЗ ибо ссылка (URL) в своей сущности это и есть текстовая строка определённого формата. 3. Ну время получения сообщения логично записывать в базу если оно нужно.
Для пробы, ничего не меняя, воткнул Ваш код в начало своей php-страницы. Мне выдало «�имер***», подумал, что проблемы с кодировкой, хотя кириллицу у меня отображает нормально. Ладно, фиг с ним, экспериментирую дальше. Слово «Пример» изменил на «123456» и мне вывело «456***» - оба, а это вообще не то пальто. Может подскажете, что не так, и в какую строку моего кода нужно вставлять? Потому что, этот код, после изменения на мою переменную - никакого результата не даёт, ничего не прячется за звёздачки. Допустим, текст сообщения выглядит таким образом: «Zdorov, posmotri na moj sait domen.ru» Да, нужно и я его записываю в базу, и оно выводится на странице, при просмотре сообщения. Только загвоздка заключается в том, что время отображается таким образом: «February 25, 2013 03:42:17 EET». А хотелось бы вот так: «получено 30 секунд назад» или «получено 15 минут назад».
Угу, там ошибка была: PHP: <?php $strdata="Пример"; echo substr($strdata, 0, 3)."***"; // возвращает "При***" ?> (http://php.su/functions/?f=substr&choice=info) По второму это называется выделить URL, либо отпарсить, полно готовых регулярок есть в интернете, как с http:// так и без него, нужно просто поискать и велосипед изобретать незачем, потом добавить html-тэги для преобразования его в полноценную кликабельную ссылку. Ну если тебе разницу во времени надо считать, то и получай разницу между текущим и тем что в базе, в базу естественно надо писать не в текстовом виде, а чтобы поле имело специальный тип дата/время, над ним доступны арифметические операции (вычитание, сложение и т.д.). Читаешь из базы вычитаешь его из текущего - получаешь разницу. Заходи на php.su и найдёшь все нужные тебе функции.
Спасибо, конечно за советы! Но то, что мне было необходимо - так и осталось за кадром. Самое главное, как всю эту х**ню влепить в мой код?! Что б оно у меня работало, а не просто в качестве примера, на левой странице с другим кодом! Относительно 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($ret, count($ret)-1, 0, 'and'); $ret[] = 'ago.'; return join(' ', $ret); } $nowtime = time(); $oldtime = '1361758625'; echo " time_elapsed_B: ".time_elapsed_B($nowtime-$oldtime). "<br>\n"; Посмотрите на мой код, что и как в нём изменить, что вставить или вырезать?
.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($ret, count($ret)-1, 0, 'and'); $ret[] = 'ago.'; return join(' ', $ret); } $oldtime = '1361758625'; echo "разница:".time_elapsed_B(time()-$oldtime); Функция просто осуществляет перевод в нормальный символьный вид из секунд в дату и время. Ну и в чём проблема? Достал время сообщения из базы, взял текущее, получил разницу и подал на вход функции. На выходе получил разницу в символьном нормальном виде (дата, время). Откуда я знаю где у тебя в базе, в какой таблице и каком поле хранится время записи? Доставай запросом его сначала сам.
А свой код в первом посте я для чего показываю? Что бы меня носом ткнули в конкретную строку, что бы сказали конкретно - куда нужно эту фигню вставить. Где нужно дописать дополнительные скобки (или ещё что-нибудь), потому что синтаксис помялся. Update! В общем, ИКСики появились Дописал одну строчку, смотреть на пятую по счёту: 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'], 0, mb_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Х". Но это и не важно, т.к. всегда будет отображаться то ли латиница, толи цыфры. Теперь нужно разобраться с отображением даты и времени.