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]   

> Без описания
rafaello9
Отправлено: 20 Ноября, 2015 - 08:14:16
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Июнь 2011  


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




Здравствуйте!
Есть обычный текст, который содержит знак $$$ в смысле доллары. Надо проверить этот текст на наличие этого символа. Для этого пишем так:
PHP:
скопировать код в буфер обмена
  1. if (preg_match('%\b$$$\b%iu', '$$$')){echo 'содержит';}

но это не работает. Также не работает и так:
PHP:
скопировать код в буфер обмена
  1.  if (preg_match('%\b\\\$\\\$\\\$\b%iu', '$$$')){echo 'содержит';}

Как определить присутствие слова $$$ в тексте?
 
 Top
vintag
Отправлено: 20 Ноября, 2015 - 09:01:17
Post Id



Новичок


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


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




rafaello9 пишет:
Здравствуйте!
Есть обычный текст, который содержит знак $$$ в смысле доллары. Надо проверить этот текст на наличие этого символа. Для этого пишем так:
PHP:
скопировать код в буфер обмена
  1. if (preg_match('%\b$$$\b%iu', '$$$')){echo 'содержит';}

но это не работает. Также не работает и так:
PHP:
скопировать код в буфер обмена
  1.  if (preg_match('%\b\\\$\\\$\\\$\b%iu', '$$$')){echo 'содержит';}

Как определить присутствие слова $$$ в тексте?


я вот не силен в этой математической функции (просто наверное не приходилось использовать часто), однако! знак доллара как минимум экранируются \$
одним слешем. Не двумя! а у вас как я понял идет экран от самой функции(разделитель)
и в первом случае для "$" его нету во втором случае аж два!

Может меня подправят дурака Радость сам такой же. учусь.
(Добавление)
vintag пишет:
rafaello9 пишет:
Здравствуйте!
Есть обычный текст, который содержит знак $$$ в смысле доллары. Надо проверить этот текст на наличие этого символа. Для этого пишем так:
PHP:
скопировать код в буфер обмена
  1. if (preg_match('%\b$$$\b%iu', '$$$')){echo 'содержит';}

но это не работает. Также не работает и так:
PHP:
скопировать код в буфер обмена
  1.  if (preg_match('%\b\\\$\\\$\\\$\b%iu', '$$$')){echo 'содержит';}

Как определить присутствие слова $$$ в тексте?


я вот не силен в этой математической функции (просто наверное не приходилось использовать часто), однако! знак доллара как минимум экранируются \$
одним слешем. Не двумя! а у вас как я понял идет экран от самой функции(разделитель)
и в первом случае для "$" его нету во втором случае аж два!

Может меня подправят дурака Радость сам такой же. учусь.

В любом случае код этого знака - \$.
 
 Top
andrewkard
Отправлено: 20 Ноября, 2015 - 10:25:11
Post Id


Участник


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


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




rafaello9
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'sdfgsd$$$sdfsdfsd';
  3. if (strpos($str,'$$$') !== false){
  4.     echo "Присутствует";
  5. }
  6.  
 
 Top
rafaello9
Отправлено: 20 Ноября, 2015 - 11:05:27
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Июнь 2011  


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




[quote=andrewkard][/quote]
Спасибо, andrewkard!
Я забыл сказать, что в силу определенных обстоятельств, необходимо использовать только preg_match и никакую другую.
Имеется очень громадный список спам-слов и текст отправляемых писем проверяется программно на присутствие спам-слов через функцию preg_match Не могу же я одно слово проверять одной ф-цией, другое другой....
 
 Top
Мелкий Супермодератор
Отправлено: 20 Ноября, 2015 - 13:03:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




"%\\\$\\\$\\\$%iu"
или
'%\\$\\$\\$%iu'

На первый взгляд неочевидно.
Символ $ - спецсимвол с точки зрения PCRE, поэтому его надо экранировать. Т.е. регулярка должна быть: %\$\$\$%iu
Далее вопрос, как объяснить парсеру PHP, какую именно строку мы хотим получить.
В одинарных кавычках символ \ является спецсимволом, его экранировать надо. А вот $ в одинарных кавычках специального значения не имеет, и если написать '\\\$', то парсер PHP увидит строку \\$
В двойных же кавычках спецсимволом является и \ и $ - поэтому пишется сначала экранированный \\, затем экранированный \$

Скорей всего вам будет полезна функция preg_quote.

rafaello9 пишет:
Не могу же я одно слово проверять одной ф-цией, другое другой....

Почему нет?


-----
PostgreSQL DBA
 
 Top
MiksIr
Отправлено: 20 Ноября, 2015 - 14:45:21
Post Id


Забанен


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


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

[+]


В общем Мелкий прав, но небольшие дополнения.

Во-первых, в регуляках просто не нужно использовать двойные кавычки. Это спасет от многих ошибок.

С одинарными кавычками - второй слеш не обязателен. Хотя документация говорит про то, что слеш нужно писать двойным, но ровно там же в примерах - есть пример с одинарным. И это хорошо.
Т.е. '%\$\$\$%iu' вполне будет работать.

preg_quote - это хорошо, что бы квотировать переменные с данными. В регулярках же есть дургой способ - \Q \E
Т.е. '%\Q$$$\E%iu'


-----
self-banned
 
 Top
rafaello9
Отправлено: 25 Ноября, 2015 - 10:19:38
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Июнь 2011  


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




Дабы не открывать новую тему, хочу спросить здесь же еще кое о чем.
Производим проверку текста письма на спам слова. Для этого используется:
PHP:
скопировать код в буфер обмена
  1. foreach ($category as $rule){
  2. if (preg_match($rule[0], $content)){
  3. //сделай то-то....
  4. }
  5. }

Вот кусок кода, где собраны спам-слова:
PHP:
скопировать код в буфер обмена
  1. $category = array (
  2. .....
  3. array('%\bЗаказ\b%ui','Содержит слово \'Заказ\'','0.9'),
  4. array('%\bзаколоть\b%ui','Содержит слово \'заколоть\'','1.1'),
  5. array('%\bзалупа\b%ui','Содержит слово \'залупа\'','0.6'),
  6. array('%\bзасирать\b%ui','Содержит слово \'засирать\'','0.7'),
  7. .......);

Получается интересная ситуация. Если я сам лично ввожу со своего компьютера и текст письма и ввожу данные в переменную $category, то все отрабатывает на ура. Но если другой пользователь, используя этот скрипт через интернет, через свой компьютер вводит текст письма, то проверка происходит через раз, какие то слова проверяются, а какие то просто игнорируются....
Получается, что здесь замешан тот факт, что шрифты у разных компьютеров разные, и поэтому во втором случае выходят осечки при проверке.
Как можно избежать этого момента?
Спасибо.
 
 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