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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: удалить из строки все небуквенно-числовые символы, оставив смайлики

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
sun1_sun2_sun3
Отправлено: 13 Августа, 2015 - 10:40:23
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




Доброе утро!
Пожалуйста, подскажите, как мне удалить из строки все небуквенно-числовые символы, но при этом оставить смайлики.
Например, юзер ввел строку:
Привет!!! :)

так вот в итоге я должна получить строку
Привет :)

Regex для того,чтобы найти, а затем удалить небуквенно-числовые символы:
/[^a-zA-ZА-Яа-я0-9\s*]/iu

как в него добавить исключение вроде
если есть последовательность символов ":)" , то ее не трогать.

Также смайлики могут быть вбиты через пробелы.
Например, ": )" вместо ":)" или ": P" вместо ":P".

Если кто-то знает, как написать такое регулярное выражение - буду рада помощи!

(Отредактировано автором: 13 Августа, 2015 - 10:41:19)

 
 Top
Panoptik
Отправлено: 13 Августа, 2015 - 11:49:07
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)





а чем привет!!! хуже чем првиет без знаков?


нужно понять насколько много смайликов есть и обработать их в виде исключеия. так как в смайликах могут использоваться очень даже не алавитно-цифровые символы

без этого смысла писать регулярку нет, потому что она потрет половину смайлов


-----
Just do it
 
 Top
andrewkard
Отправлено: 13 Августа, 2015 - 12:01:06
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Можно так:
/[А-Яа-я\s\:\)]{1,}/
 
 Top
sun1_sun2_sun3
Отправлено: 13 Августа, 2015 - 12:18:22
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




> а чем привет!!! хуже чем привет без знаков?
Это я так для наглядности взяла пример)

> нужно понять насколько много смайликов есть и обработать их в виде исключеия. так как в смайликах могут использоваться очень даже не алавитно-цифровые символы
> без этого смысла писать регулярку нет, потому что она потрет половину смайлов
Я думаю обрабатывать только самые распространенные смайлики (не больше 20).
для начала :) и :(.

я не могу додуматься как их в регулярку засунуть


> Можно так:
/[А-Яа-я\s\:\)]{1,}/

эта регулярка не подойдет, так как часть выделенная жирным
/[А-Яа-я\s\:\)]{1,}/
будет искать отдельные символы :, ).
А мне нужно, именно, последовательность символов :)
(также необходимо учесть что смайлик может быть введен с пробелами).


P.S. Спасибо большое за помощь

(Отредактировано автором: 13 Августа, 2015 - 12:24:07)

 
 Top
andrewkard
Отправлено: 13 Августа, 2015 - 12:41:46
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Тогда может как то так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $arr_smile = array(':)',': )',':Р',': Р');
  3. $str = 'Привет!!! :)';
  4. $pattern = '/[^a-zA-ZА-Яа-я0-9\s\:\)*]/iu';
  5. $str_clear = preg_replace($pattern, '', $str);
  6. $str_test = $str_clear;
  7. foreach($arr_smile as $smile){
  8.     $str_test = str_replace($smile, '', $str_test);
  9. }
  10.  
  11. if (preg_match($pattern, $str_test)) {
  12.     echo "Error";
  13. } else {
  14.     echo $str_clear;
  15. }
  16.  
 
 Top
sun1_sun2_sun3
Отправлено: 13 Августа, 2015 - 13:04:08
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




нет, к сожалению этот скрипт не работает
 
 Top
andrewkard
Отправлено: 13 Августа, 2015 - 13:06:07
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




sun1_sun2_sun3 пишет:
нет, к сожалению этот скрипт не работает

Почему? На Ваших данных отработал верно.
 
 Top
sun1_sun2_sun3
Отправлено: 13 Августа, 2015 - 13:22:21
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




а вы попробуйте обработать строку
Hello!!! i:u (o) :)

Результат:
Hello i:u o) :)

Должен быть:
Hello iu o :)

(Отредактировано автором: 13 Августа, 2015 - 13:25:05)

 
 Top
andrewkard
Отправлено: 13 Августа, 2015 - 14:01:58
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Тогда нужно эти символы дополнительно обрабатывать, например так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $arr_smile = array(':)',': )',':Р',': Р');
  3. $str = 'Hello!!! i:u (o)и :)';
  4. $arr_symbols=array();
  5.  
  6. //запоминаем символы ":" и ")", которые не являются смайликом
  7. for ($i=1;$i<strlen($str)-1;$i++){
  8.     if($str[$i] == ':'){
  9.         if($str[$i-1] != ' '){
  10.             $arr_symbols[]=$i;
  11.         } else {
  12.             if($str[$i+1] == ' ' || $str[$i+1] == ')'){} else {
  13.                 $arr_symbols[]=$i;
  14.             }
  15.         }
  16.     }
  17.     if($str[$i] == ')'){
  18.         if($str[$i+1] != ' '){
  19.             $arr_symbols[]=$i;
  20.         } else {
  21.             if($str[$i-1] == ' ' || $str[$i-1] == ':'){} else {
  22.                 $arr_symbols[]=$i;
  23.             }
  24.         }
  25.     }
  26. }
  27.  
  28. //сортируме массив символов в обратном порядке
  29. arsort($arr_symbols);
  30.  
  31. //затираем символы ":" и ")", которые не являются смайликом
  32. foreach ($arr_symbols as $symbos){
  33.     $str[$symbos]='';
  34. }
  35.  
  36. //чистим строку
  37. $pattern = '/[^a-zA-ZА-Яа-я0-9\s\:\)*]/iu';
  38. $str_clear = preg_replace($pattern, '', $str);
  39.  
  40. //убираем смайлы для теста
  41. $str_test = $str_clear;
  42. foreach($arr_smile as $smile){
  43.     $str_test = str_replace($smile, '', $str_test);
  44. }
  45.  
  46. //если другие символы не найдены, выводим строку, иначе ошибка
  47. if (preg_match($pattern, $str_test)) {
  48.     echo "Error";
  49. } else {
  50.     echo $str_clear;
  51. }
  52.  
  53.  

(Добавление)
Правда нужно еще подумать как правильно эти условия прописать

(Отредактировано автором: 13 Августа, 2015 - 14:18:32)

 
 Top
Sail
Отправлено: 13 Августа, 2015 - 14:23:13
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




sun1_sun2_sun3 и придумать, почему :P считается смайликом, а :u - нет Улыбка
 
 Top
sun1_sun2_sun3
Отправлено: 13 Августа, 2015 - 14:41:46
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2012  


Помог: 0 раз(а)




andrewkard, спасибо большое за помощь
этот скрипт корректно очищает строку

вот только хотелось бы объединить это все в 1 регулярку

поиск небуквенно-цифровых символов /[^a-zA-Z0-9\s*]/iu
поиск смайлика :P /((?<!(:P)).)*/iu

как их объединить?
что-то вроде, если в строке есть разрешенный смайлик -> его не трогать

(Отредактировано автором: 13 Августа, 2015 - 14:44:26)

 
 Top
andrewkard
Отправлено: 13 Августа, 2015 - 15:10:47
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




sun1_sun2_sun3 пишет:
вот только хотелось бы объединить это все в 1 регулярку

вряд ли это возможно
(Добавление)
Можно уменьшить количество ошибок, на клиенте перед отправкой проверяйте по такому выражению, и если такие символы присутствуют, подсвечивайте их и не позволяйте отправить до исправления.
/([^\s]{1}\:|\)[^\s]{1})/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB