Форумы портала PHP.SU » PHP » Регулярные выражения » Экранирование метасимволов

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

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

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

Как определить присутствие слова $$$ в тексте?
2. vintag - 20 Ноября, 2015 - 09:01:17 - перейти к сообщению
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 'содержит';}

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


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

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

В любом случае код этого знака - \$.
3. andrewkard - 20 Ноября, 2015 - 10:25:11 - перейти к сообщению
rafaello9
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'sdfgsd$$$sdfsdfsd';
  3. if (strpos($str,'$$$') !== false){
  4.     echo "Присутствует";
  5. }
  6.  
4. rafaello9 - 20 Ноября, 2015 - 11:05:27 - перейти к сообщению
[quote=andrewkard][/quote]
Спасибо, andrewkard!
Я забыл сказать, что в силу определенных обстоятельств, необходимо использовать только preg_match и никакую другую.
Имеется очень громадный список спам-слов и текст отправляемых писем проверяется программно на присутствие спам-слов через функцию preg_match Не могу же я одно слово проверять одной ф-цией, другое другой....
5. Мелкий - 20 Ноября, 2015 - 13:03:33 - перейти к сообщению
"%\\\$\\\$\\\$%iu"
или
'%\\$\\$\\$%iu'

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

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

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

Почему нет?
6. MiksIr - 20 Ноября, 2015 - 14:45:21 - перейти к сообщению
В общем Мелкий прав, но небольшие дополнения.

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

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

preg_quote - это хорошо, что бы квотировать переменные с данными. В регулярках же есть дургой способ - \Q \E
Т.е. '%\Q$$$\E%iu'
7. rafaello9 - 25 Ноября, 2015 - 10:19:38 - перейти к сообщению
Дабы не открывать новую тему, хочу спросить здесь же еще кое о чем.
Производим проверку текста письма на спам слова. Для этого используется:
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, то все отрабатывает на ура. Но если другой пользователь, используя этот скрипт через интернет, через свой компьютер вводит текст письма, то проверка происходит через раз, какие то слова проверяются, а какие то просто игнорируются....
Получается, что здесь замешан тот факт, что шрифты у разных компьютеров разные, и поэтому во втором случае выходят осечки при проверке.
Как можно избежать этого момента?
Спасибо.

 

Powered by ExBB FM 1.0 RC1