Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: как выбрать username из [@username]
Форумы портала PHP.SU » » Вопросы новичков » как выбрать username из [@username]

Страниц (1): [1]
 

1. TUDEAL - 22 Октября, 2013 - 21:07:48 - перейти к сообщению
Есть строка для обращения к пользователям
[@username]
где username логин пользователя к кому мы обращаемся в чате и может иметь разную длину
как отсюда выбрать именно этот username и откинуть [@]
сообщение может быть обращено сразу к нескольким людям таким образом
[@user1][@user2][@user3] и.т.д... нужно выбрать все 3 логина и если в списке имеется твой подсветить сообщение
2. esterio - 23 Октября, 2013 - 11:49:53 - перейти к сообщению
регулярка
PHP:
скопировать код в буфер обмена
  1. preg_match_all('/\[@([^\]]+)\]/s', $string, $matches, PREG_SET_ORDER);
  2. var_dump($matches);
3. LIME - 23 Октября, 2013 - 12:04:08 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $users=array_map(function($a){
  2.     return trim($a,'@[]');},explode('][',$usersStr));
4. TUDEAL - 23 Октября, 2013 - 21:16:18 - перейти к сообщению
Еще вопрос, где можно взять подробную инструкцию по этим функциям?)
5. IllusionMH - 23 Октября, 2013 - 21:21:29 - перейти к сообщению
TUDEAL, клик по подчеркнутым названиям функций. Либо искать в официальной документации на http://php.net (тут еще и примеры в комментариях)
6. TUDEAL - 23 Октября, 2013 - 23:20:54 - перейти к сообщению
Короче ни одним из способов не подошел, сделал по своему.
PHP:
скопировать код в буфер обмена
  1. function user_parsing($u)
  2. {
  3.     $u = preg_replace( "#\[@(.+?)\\]#is" , "<b> » \\1</b>" ,$u);
  4.     return $u;
  5. }

Но одна проблема, если в чате пишут тебе [@username] то твой ник должен выделиться зеленым цветом, а остальные остаться черными, сообщение может даже иметь такой вид "текст [@UserName] сообщения" должно вывестись так "текст UserName сообщения" и если UserName это ты то оно должно подсветиться зеленым.
Пробовал так
PHP:
скопировать код в буфер обмена
  1. function user_parsing($u)
  2. {
  3.     function matches($str1)
  4.     {
  5.         $str2 = $_SESSION['login'];
  6.         if($str1==$str2)
  7.         {
  8.             return '<b class="adress_me">';
  9.         }
  10.         else
  11.         {
  12.             return '<b class="adress_orher">';
  13.         }
  14.     }
  15.     $u = preg_replace( "#\[@(.+?)\\]#is" , matches('\\1')." » \\1</b>" ,$u);
  16.     return $u;
  17. }

Но так тоже не работает потому что $str1 и $str2 определяются как различные, хотя при попытка вывести их выводятся как одинаковые на экран, но $str2 привести к нижнему регистру не возможно, md5 код у обоих значений разный, приведение типов не помогает, смена кодировки через iconv тоже результата не дает -_-
7. Мелкий - 24 Октября, 2013 - 09:39:46 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $sMyLogin = $_SESSION['login'];
  2. return preg_replace_callback( "#\[@([^\]]+)\]#is" , function($matches) use($sMyLogin) {
  3. if ($sMyLogin == $matches[1]) return '<b> » '.$sMyLogin.'</b>';
  4. else return $matches[1];
  5. } ,$u);


Сравнение логинов регистрозависимое.
8. TUDEAL - 25 Октября, 2013 - 02:52:50 - перейти к сообщению
Мелкий пишет:
PHP:
скопировать код в буфер обмена
  1. $sMyLogin = $_SESSION['login'];
  2. return preg_replace_callback( "#\[@([^\]]+)\]#is" , function($matches) use($sMyLogin) {
  3. if ($sMyLogin == $matches[1]) return '<b> » '.$sMyLogin.'</b>';
  4. else return $matches[1];
  5. } ,$u);



Вот, именно то что я и искал! Спасибо! Закатив глазки

 

Powered by ExBB FM 1.0 RC1