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

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

1. rafaello9 - 25 Ноября, 2015 - 13:42:01 - перейти к сообщению
Необходимо произвести проверку текста письма на спам слова. Для этого используется:
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, то все отрабатывает на ура. Но если другой пользователь, используя этот скрипт через интернет, через свой компьютер вводит текст письма, то проверка происходит через раз, какие то слова проверяются, а какие то просто игнорируются....
Получается, что здесь замешан тот факт, что шрифты у разных компьютеров разные, и поэтому во втором случае выходят осечки при проверке.
Как можно избежать этого момента? Неужели дело в шрифтах?
Есть какой то способ при сохранении текста письма приводить его к единому виду?
Спасибо.

При проверке журнала ошибок нашел вот это:
CODE (htmlphp):
скопировать код в буфер обмена
  1. preg_match(): Compilation failed: invalid UTF-8 string at offset 2
2. DelphinPRO - 25 Ноября, 2015 - 16:49:55 - перейти к сообщению
rafaello9 пишет:
Получается, что здесь замешан тот факт, что шрифты у разных компьютеров разные

оригинальненько Улыбка но мимо

из журнала должно быть ясно, что дело в кодировке

Use utf-8, Luke
3. rafaello9 - 25 Ноября, 2015 - 17:54:46 - перейти к сообщению
Цитата:
из журнала должно быть ясно, что дело в кодировке

Дело в том, что я не могу же контролировать любого пользователя, который заходит через интернет и создает/сохраняет новое письмо.
Это что же получается, что пользователь вводит русский текст, а он сохраняется не в той кодировке? Или как это понять?

Ведь я же в самом начале определил вопрос так: если я ввожу и сохраняю текст, то все отрабатывает, а если вводит текст (русский) другой пользователь, то у него отрабатывает через раз, одно слово видит, другое не видит...
(Добавление)
Только сейчас допер....:
Это что же получается, что хитрые пользователи заменяют хотя-бы одну букву (например, в слове "заработать" "а" русское на "а" латинское, или "р" русское на "р" латинское), чтобы их письмо сохранилось в базу данных со спам-словом, которое нужно им?
Вот это да, ну и хитрецы....
И при проверке слова "заработать", содержащее набор из русских и латинских букв и выдает эту самую ошибку:
CODE (htmlphp):
скопировать код в буфер обмена
  1.     preg_match(): Compilation failed: invalid UTF-8 string at offset 2


Если это так, то как с этим бороться?
4. DelphinPRO - 25 Ноября, 2015 - 22:41:00 - перейти к сообщению
надо читать документацию...

Замену русских букв на латинские вы никак не предотвратите, кроме как перечислением всех вариантов, но ошибку "Compilation failed: invalid UTF-8" предотвратить можете...
5. rafaello9 - 26 Ноября, 2015 - 15:12:22 - перейти к сообщению
Хорошо, ошибку: "Compilation failed: invalid UTF-8" я исправить постараюсь...
Но вот как быть с подменой русских букв на латинские?
Вообще это реально настроить проверку на подмену букв?
Например, как будет выглядеть регулярка для подмены букв в слове "заработать"?

Да и вообще, мне кажется, найти подмену букв - это полдела. Вот как перевести найденные латинские буквы обратно?
Спасибо!
6. Мелкий - 26 Ноября, 2015 - 16:01:44 - перейти к сообщению
rafaello9 пишет:
preg_match(): Compilation failed: invalid UTF-8 string at offset 2

Как, надеюсь, известно, UTF несколько сложнее однобайтовых кодировок.
В отличии от кодировок фиксированной длины (1 байт как наиболее распространённый вариант), UTF имеет нефиксированную длину. А вот чтобы понимать, где три однобайтовых символа, а где один трёхбайтовый - начинаются фокусы с использованием старшего бита.
Как побочный эффект далеко не любое сочетание байтов будет являться UTF строкой. В отличии от всяких cp1251 и прочей исторической белиберды, где для любого байта найдётся свой символ.

Например, PHP5 нативно не проверяет корректность UTF, хранит строки как набор байт. А PCRE проверяет. И когда видит в регулярке невозможную для UTF8 последовательность байт, то очень обижается и отказывается работать.
Повторюсь: в регулярке. В проверяемых данных допустим любой бинарник и обработан будет корректно.

rafaello9 пишет:
проверку текста письма на спам слова

http://lurkmore[dot]to/вордфильтр
Уж если вы только сейчас сообразили про банальнейшую замену кириллицы на похожую по начертанию латинницу - бросайте эту затею.

 

Powered by ExBB FM 1.0 RC1