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 :: Как работает эта регулярка?
1. Что такое /msiu?
2. Если кавычку поставлю перед квадратной скобкой вообще не работает.
3. Что означает +$
Мелкий
Отправлено: 16 Июля, 2018 - 15:36:19
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Ммм, а вы вообще что-нибудь по синтаксису регулярок читали?
1. модификаторы
2. какую кавычку?
3. Это два разных спецсимвола, и их объясняют буквально в любом руководстве. Это не рекурсивная регулярка, а совершенно базовые вещи. + - сокращение для {1,}, $ - конец строки
----- PostgreSQL DBA
Doox911
Отправлено: 16 Июля, 2018 - 15:40:59
Частый гость
Покинул форум
Сообщений всего: 166
Дата рег-ции: Сент. 2011
Помог: 0 раз(а)
Мелкий пишет:
Ммм, а вы вообще что-нибудь по синтаксису регулярок читали?
1. модификаторы
2. какую кавычку?
3. Это два разных спецсимвола, и их объясняют буквально в любом руководстве. Это не рекурсивная регулярка, а совершенно базовые вещи. + - сокращение для {1,}, $ - конец строки
Я тут немного начал разбираться... Но что такое /msiu?
При попытке оставить только русские буквы
Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
Doox911 пишет:
А юникод потому что некоторые русские символы не влезли?
u - потому что работаете с многобайтовой кодировкой. Но есть случаи, в которых при работе с юникодом, модификатор u можно не указывать - обычно это когда в шаблоне искомое слово прописано как есть. Сравните эти два примера:
Покинул форум
Сообщений всего: 166
Дата рег-ции: Сент. 2011
Помог: 0 раз(а)
Строитель пишет:
Doox911 пишет:
А юникод потому что некоторые русские символы не влезли?
u - потому что работаете с многобайтовой кодировкой. Но есть случаи, в которых при работе с юникодом, модификатор u можно не указывать - обычно это когда в шаблоне искомое слово прописано как есть. Сравните эти два примера:
Становится очевидно, почему ^т$ и ^[т]$ ведут себя различно в зависимости от u?
Сравниваем байты или символы. Маленькая разница, небольшие но важные изменения. (Добавление)
Ну и маленький выдуманный пример, проверим, что в строке есть хотя бы одна буква а, б или в:
Становится очевидно, почему ^т$ и ^[т]$ ведут себя различно в зависимости от u?
Сравниваем байты или символы. Маленькая разница, небольшие но важные изменения. (Добавление)
Ну и маленький выдуманный пример, проверим, что в строке есть хотя бы одна буква а, б или в:
Если я правильно понял, то результат не корректный при перемене мест символов? И очень странно сто без модификатора u находит.
Мелкий
Отправлено: 18 Июля, 2018 - 11:57:45
Активный участник
Покинул форум
Сообщений всего: 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
Doox911
Отправлено: 18 Июля, 2018 - 12:16:40
Частый гость
Покинул форум
Сообщений всего: 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 байты? Или символы? Я предполагаю, что это символы "," и "С".
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Doox911 пишет:
\xd1\x82 - этo байты?
Это байты в распространённой hex записи.
Пользуясь какой-нибудь таблицей кодирования можно попробовать представить в виде символов.
Для utf8 это будет один символ т, для cp1251 - строка из двух символов: "С‚", строка "Ń‚" в cp1250 и так далее по куче разных кодировок с различным эффектом.
Doox911 пишет:
Не совсем понял что за d0 b0:
Тоже байты в hex виде. Без \x и с пробелами обычно читается легче человеком.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.