Форумы портала PHP.SU » PHP » Регулярные выражения » удалить из строки все небуквенно-числовые символы, оставив смайлики

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

1. sun1_sun2_sun3 - 13 Августа, 2015 - 10:40:23 - перейти к сообщению
Доброе утро!
Пожалуйста, подскажите, как мне удалить из строки все небуквенно-числовые символы, но при этом оставить смайлики.
Например, юзер ввел строку:
Привет!!! :)

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

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

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

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

Если кто-то знает, как написать такое регулярное выражение - буду рада помощи!
2. Panoptik - 13 Августа, 2015 - 11:49:07 - перейти к сообщению

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


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

без этого смысла писать регулярку нет, потому что она потрет половину смайлов
3. andrewkard - 13 Августа, 2015 - 12:01:06 - перейти к сообщению
Можно так:
/[А-Яа-я\s\:\)]{1,}/
4. sun1_sun2_sun3 - 13 Августа, 2015 - 12:18:22 - перейти к сообщению
> а чем привет!!! хуже чем привет без знаков?
Это я так для наглядности взяла пример)

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

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


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

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


P.S. Спасибо большое за помощь
5. andrewkard - 13 Августа, 2015 - 12:41:46 - перейти к сообщению
Тогда может как то так:
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.  
6. sun1_sun2_sun3 - 13 Августа, 2015 - 13:04:08 - перейти к сообщению
нет, к сожалению этот скрипт не работает
7. andrewkard - 13 Августа, 2015 - 13:06:07 - перейти к сообщению
sun1_sun2_sun3 пишет:
нет, к сожалению этот скрипт не работает

Почему? На Ваших данных отработал верно.
8. sun1_sun2_sun3 - 13 Августа, 2015 - 13:22:21 - перейти к сообщению
а вы попробуйте обработать строку
Hello!!! i:u (o) :)

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

Должен быть:
Hello iu o :)
9. andrewkard - 13 Августа, 2015 - 14:01:58 - перейти к сообщению
Тогда нужно эти символы дополнительно обрабатывать, например так:
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.  

(Добавление)
Правда нужно еще подумать как правильно эти условия прописать
10. Sail - 13 Августа, 2015 - 14:23:13 - перейти к сообщению
sun1_sun2_sun3 и придумать, почему :P считается смайликом, а :u - нет Улыбка
11. sun1_sun2_sun3 - 13 Августа, 2015 - 14:41:46 - перейти к сообщению
andrewkard, спасибо большое за помощь
этот скрипт корректно очищает строку

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

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

как их объединить?
что-то вроде, если в строке есть разрешенный смайлик -> его не трогать
12. andrewkard - 13 Августа, 2015 - 15:10:47 - перейти к сообщению
sun1_sun2_sun3 пишет:
вот только хотелось бы объединить это все в 1 регулярку

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

 

Powered by ExBB FM 1.0 RC1