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
Форумы портала PHP.SU :: Версия для печати :: Как работает эта регулярка?
Форумы портала PHP.SU » » Вопросы новичков » Как работает эта регулярка?

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

1. Doox911 - 16 Июля, 2018 - 14:47:55 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. preg_replace('/[^А-ЯЁа-яё]+$/msiu', '', $_POST["new"]);

1. Что такое /msiu?
2. Если кавычку поставлю перед квадратной скобкой вообще не работает.
3. Что означает +$
2. Мелкий - 16 Июля, 2018 - 15:36:19 - перейти к сообщению
Ммм, а вы вообще что-нибудь по синтаксису регулярок читали?
1. модификаторы
2. какую кавычку?
3. Это два разных спецсимвола, и их объясняют буквально в любом руководстве. Это не рекурсивная регулярка, а совершенно базовые вещи. + - сокращение для {1,}, $ - конец строки
3. Doox911 - 16 Июля, 2018 - 15:40:59 - перейти к сообщению
Мелкий пишет:
Ммм, а вы вообще что-нибудь по синтаксису регулярок читали?
1. модификаторы
2. какую кавычку?
3. Это два разных спецсимвола, и их объясняют буквально в любом руководстве. Это не рекурсивная регулярка, а совершенно базовые вещи. + - сокращение для {1,}, $ - конец строки

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

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

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

Не получается один пробел оставить между словами(
4. andrewkard - 16 Июля, 2018 - 15:57:52 - перейти к сообщению
Рекомендую https://regex101[dot]com/
Справа расписывается что к чему
5. Doox911 - 16 Июля, 2018 - 17:42:10 - перейти к сообщению
Спасибо. Только там работает: /[А-ЯЁа-яё]+/ так. А в php только так: /[А-ЯЁа-яё]+/iu - обязательно юникод указывать надо. Почему?
6. Строитель - 16 Июля, 2018 - 21:45:27 - перейти к сообщению
Doox911, для такого шаблона /[А-ЯЁа-яё]+/iu указывать регистронезависимый модификатор i как-то бессмысленно ... Можно сократить запись:
/[а-яё]+/iu
7. Doox911 - 18 Июля, 2018 - 07:57:54 - перейти к сообщению
Строитель пишет:
Doox911, для такого шаблона /[А-ЯЁа-яё]+/iu указывать регистронезависимый модификатор i как-то бессмысленно ... Можно сократить запись:
/[а-яё]+/iu

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


Интересно. А почему так?
10. Строитель - 18 Июля, 2018 - 08:58:21 - перейти к сообщению
Doox911 пишет:
Интересно. А почему так?
Ну до таких тонкостей в изучении regex я не углублялся Закатив глазки Лично мне было достаточно знания того, как правильно работать с этим инструментом.
11. Мелкий - 18 Июля, 2018 - 10:33:05 - перейти к сообщению
Потому что регулярка - это весьма глупый конечный автомат. Без модификатора 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?

Сравниваем байты или символы. Маленькая разница, небольшие но важные изменения.
(Добавление)
Ну и маленький выдуманный пример, проверим, что в строке есть хотя бы одна буква а, б или в:
PHP:
скопировать код в буфер обмена
  1. var_dump(preg_match("~[абв]~u", "где"));
  2. var_dump(preg_match("~[абв]~", "где"));
12. Doox911 - 18 Июля, 2018 - 11:13:17 - перейти к сообщению
Мелкий пишет:
Потому что регулярка - это весьма глупый конечный автомат. Без модификатора 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 находит.
13. Мелкий - 18 Июля, 2018 - 11:57:45 - перейти к сообщению
Зависит от того что считать корректным. С точки зрения механики - все результаты корректны.

Мелкий пишет:
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.
14. Doox911 - 18 Июля, 2018 - 12:16:40 - перейти к сообщению
Мелкий пишет:
Зависит от того что считать корректным. С точки зрения механики - все результаты корректны.

Мелкий пишет:
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?
15. Мелкий - 18 Июля, 2018 - 12:44:54 - перейти к сообщению
Doox911 пишет:
\xd1\x82 - этo байты?

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

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

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

 

Powered by ExBB FM 1.0 RC1