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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Doox911
Отправлено: 16 Июля, 2018 - 14:47:55
Post Id



Частый гость


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


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




PHP:
скопировать код в буфер обмена
  1. preg_replace('/[^А-ЯЁа-яё]+$/msiu', '', $_POST["new"]);

1. Что такое /msiu?
2. Если кавычку поставлю перед квадратной скобкой вообще не работает.
3. Что означает +$
 
 Top
Мелкий Супермодератор
Отправлено: 16 Июля, 2018 - 15:36:19
Post Id



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


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


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




Ммм, а вы вообще что-нибудь по синтаксису регулярок читали?
1. модификаторы
2. какую кавычку?
3. Это два разных спецсимвола, и их объясняют буквально в любом руководстве. Это не рекурсивная регулярка, а совершенно базовые вещи. + - сокращение для {1,}, $ - конец строки


-----
PostgreSQL DBA
 
 Top
Doox911
Отправлено: 16 Июля, 2018 - 15:40:59
Post Id



Частый гость


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


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




Мелкий пишет:
Ммм, а вы вообще что-нибудь по синтаксису регулярок читали?
1. модификаторы
2. какую кавычку?
3. Это два разных спецсимвола, и их объясняют буквально в любом руководстве. Это не рекурсивная регулярка, а совершенно базовые вещи. + - сокращение для {1,}, $ - конец строки

Я тут немного начал разбираться... Но что такое /msiu?
При попытке оставить только русские буквы

Выдаёт �� хотя там и там utf-8.

Это модификаторы!)

Не получается один пробел оставить между словами(

(Отредактировано автором: 16 Июля, 2018 - 15:55:42)

 
 Top
andrewkard
Отправлено: 16 Июля, 2018 - 15:57:52
Post Id


Участник


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


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




Рекомендую https://regex101[dot]com/
Справа расписывается что к чему
 
 Top
Doox911
Отправлено: 16 Июля, 2018 - 17:42:10
Post Id



Частый гость


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


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




Спасибо. Только там работает: /[А-ЯЁа-яё]+/ так. А в php только так: /[А-ЯЁа-яё]+/iu - обязательно юникод указывать надо. Почему?
 
 Top
Строитель Модератор
Отправлено: 16 Июля, 2018 - 21:45:27
Post Id



Участник


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


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




Doox911, для такого шаблона /[А-ЯЁа-яё]+/iu указывать регистронезависимый модификатор i как-то бессмысленно ... Можно сократить запись:
/[а-яё]+/iu
 
 Top
Doox911
Отправлено: 18 Июля, 2018 - 07:57:54
Post Id



Частый гость


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


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




Строитель пишет:
Doox911, для такого шаблона /[А-ЯЁа-яё]+/iu указывать регистронезависимый модификатор i как-то бессмысленно ... Можно сократить запись:
/[а-яё]+/iu

Да согласен. На просторах рунета пишут как я))) Наверно такие же умельцы..
А юникод потому что некоторые русские символы не влезли?

(Отредактировано автором: 18 Июля, 2018 - 07:59:01)

 
 Top
Строитель Модератор
Отправлено: 18 Июля, 2018 - 08:29:30
Post Id



Участник


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


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




Doox911 пишет:
А юникод потому что некоторые русские символы не влезли?
u - потому что работаете с многобайтовой кодировкой. Но есть случаи, в которых при работе с юникодом, модификатор u можно не указывать - обычно это когда в шаблоне искомое слово прописано как есть. Сравните эти два примера:
Спойлер (Отобразить)
 
 Top
Doox911
Отправлено: 18 Июля, 2018 - 08:55:29
Post Id



Частый гость


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


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




Строитель пишет:
Doox911 пишет:
А юникод потому что некоторые русские символы не влезли?
u - потому что работаете с многобайтовой кодировкой. Но есть случаи, в которых при работе с юникодом, модификатор u можно не указывать - обычно это когда в шаблоне искомое слово прописано как есть. Сравните эти два примера:
Спойлер (Отобразить)


Интересно. А почему так?
 
 Top
Строитель Модератор
Отправлено: 18 Июля, 2018 - 08:58:21
Post Id



Участник


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


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




Doox911 пишет:
Интересно. А почему так?
Ну до таких тонкостей в изучении regex я не углублялся Закатив глазки Лично мне было достаточно знания того, как правильно работать с этим инструментом.
 
 Top
Мелкий Супермодератор
Отправлено: 18 Июля, 2018 - 10:33:05
Post Id



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


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


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




Потому что регулярка - это весьма глупый конечный автомат. Без модификатора u в действии бинарное сравнение.

PHP:
скопировать код в буфер обмена
  1. var_dump(preg_match('~[а-яё]~', "\x82\xd1"));
  2. var_dump(preg_match('~[а-яё]~', "\xd1\x82"));
  3. var_dump(preg_match('~[а-яё]~u', "\x82\xd1"));
  4. var_dump(preg_match('~[а-яё]~u', "\xd1\x82"));

Какие будут результаты, если заведомо известно, что UTF8 символ кириллицы "т" - это hex число d1 82, а число 82 d1 недопустимо для utf8.

Ну и показательнее будет:
PHP:
скопировать код в буфер обмена
  1. var_dump(preg_match("~^[т]$~u", "\xd1\x82"));
  2. var_dump(preg_match("~^[т]$~u", "\x82\xd1"));
  3. var_dump(preg_match("~^[т]$~", "\xd1\x82"));
  4. var_dump(preg_match("~^[т]$~", "\x82\xd1"));

Становится очевидно, почему ^т$ и ^[т]$ ведут себя различно в зависимости от u?

Сравниваем байты или символы. Маленькая разница, небольшие но важные изменения.
(Добавление)
Ну и маленький выдуманный пример, проверим, что в строке есть хотя бы одна буква а, б или в:


-----
PostgreSQL DBA
 
 Top
Doox911
Отправлено: 18 Июля, 2018 - 11:13:17
Post Id



Частый гость


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


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




Мелкий пишет:
Потому что регулярка - это весьма глупый конечный автомат. Без модификатора u в действии бинарное сравнение.

PHP:
скопировать код в буфер обмена
  1. var_dump(preg_match('~[а-яё]~', "\x82\xd1"));
  2. var_dump(preg_match('~[а-яё]~', "\xd1\x82"));
  3. var_dump(preg_match('~[а-яё]~u', "\x82\xd1"));
  4. var_dump(preg_match('~[а-яё]~u', "\xd1\x82"));

Какие будут результаты, если заведомо известно, что UTF8 символ кириллицы "т" - это hex число d1 82, а число 82 d1 недопустимо для utf8.

Ну и показательнее будет:
PHP:
скопировать код в буфер обмена
  1. var_dump(preg_match("~^[т]$~u", "\xd1\x82"));
  2. var_dump(preg_match("~^[т]$~u", "\x82\xd1"));
  3. var_dump(preg_match("~^[т]$~", "\xd1\x82"));
  4. var_dump(preg_match("~^[т]$~", "\x82\xd1"));

Становится очевидно, почему ^т$ и ^[т]$ ведут себя различно в зависимости от u?

Сравниваем байты или символы. Маленькая разница, небольшие но важные изменения.
(Добавление)
Ну и маленький выдуманный пример, проверим, что в строке есть хотя бы одна буква а, б или в:


Если я правильно понял, то результат не корректный при перемене мест символов? И очень странно сто без модификатора u находит.
 
 Top
Мелкий Супермодератор
Отправлено: 18 Июля, 2018 - 11:57:45
Post Id



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


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


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




Зависит от того что считать корректным. С точки зрения механики - все результаты корректны.

Мелкий пишет:
var_dump(preg_match("~[абв]~", "где"));

Обозначу для краткости символы:
а состоит из байтов 1 и 2 (реально d0 b0)
б - 1 и 3 (d0 b1)
в - 1 и 4 (d0 b2)
г - 1 и 5 (d0 b3)
д - 1 и 6 (d0 b4)
е - 1 и 7 (d0 b5)
да, d0 у них у всех реально совпадает. В итоге получаем без модификатора u выражение:

Именно так, сравниваем байты, в символьной маске не 3 объекта для сравнения, а 6, из них 3 одинаковые. Есть у нас байт 1? Есть, потому и получаем совпадение.

С модификатором u рассматриваем именно символы, потому в символьной маске будет только 3 объекта. И соответственно отсутствие совпадения.

Doox911 пишет:
при перемене мест символов?

При перемене мест байт. Я специально воспользовался hex записью чтобы проиллюстрировать и дописал комментарий, что такая изменённая последовательность байт вообще недопустима в utf8.


-----
PostgreSQL DBA
 
 Top
Doox911
Отправлено: 18 Июля, 2018 - 12:16:40
Post Id



Частый гость


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


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




Мелкий пишет:
Зависит от того что считать корректным. С точки зрения механики - все результаты корректны.

Мелкий пишет:
var_dump(preg_match("~[абв]~", "где"));

Обозначу для краткости символы:
а состоит из байтов 1 и 2 (реально d0 b0)
б - 1 и 3 (d0 b1)
в - 1 и 4 (d0 b2)
г - 1 и 5 (d0 b3)
д - 1 и 6 (d0 b4)
е - 1 и 7 (d0 b5)
да, d0 у них у всех реально совпадает. В итоге получаем без модификатора u выражение:

Именно так, сравниваем байты, в символьной маске не 3 объекта для сравнения, а 6, из них 3 одинаковые. Есть у нас байт 1? Есть, потому и получаем совпадение.

С модификатором u рассматриваем именно символы, потому в символьной маске будет только 3 объекта. И соответственно отсутствие совпадения.

Doox911 пишет:
при перемене мест символов?

При перемене мест байт. Я специально воспользовался hex записью чтобы проиллюстрировать и дописал комментарий, что такая изменённая последовательность байт вообще недопустима в utf8.


С точки зрения механики - бесспорно).

Я что-то запутался.
\xd1\x82 - этo байты? Или символы? Я предполагаю, что это символы "," и "С".

Не совсем понял что за d0 b0:
http://fkn[dot]ktu10[dot]com/?q=node/5542 Hex-16?
 
 Top
Мелкий Супермодератор
Отправлено: 18 Июля, 2018 - 12:44:54
Post Id



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


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


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




Doox911 пишет:
\xd1\x82 - этo байты?

Это байты в распространённой hex записи.
Пользуясь какой-нибудь таблицей кодирования можно попробовать представить в виде символов.
Для utf8 это будет один символ т, для cp1251 - строка из двух символов: "С‚", строка "Ń‚" в cp1250 и так далее по куче разных кодировок с различным эффектом.

Doox911 пишет:
Не совсем понял что за d0 b0:

Тоже байты в hex виде. Без \x и с пробелами обычно читается легче человеком.


-----
PostgreSQL DBA
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB