Когда мне нужен U-модификатор в регулярных выражениях PHP? - PullRequest
0 голосов
/ 26 сентября 2019

Я знаю, что функции PHP PCRE обрабатывают строки как байтовые последовательности, поэтому многие сайты предлагают использовать модификатор /u для обработки ввода и регулярных выражений как UTF-8.

Но действительно ли мне это нужно всегда?Мои тесты показывают, что этот флаг не имеет значения, когда я не использую escape-последовательности или точки или что-то вроде этого.

Например

preg_match('/^[\da-f]{40}$/', $string);, чтобы проверить, имеет ли строка форматхэш SHA1

preg_replace('/[^a-zA-Z0-9]/', $spacer, $string); для замены каждого символа, не являющегося буквой ASCII или числом

preg_replace('/^\+\((.*)\)$/', '\1', $string); для получения внутреннего содержимого +(XYZ)

Эти регулярные выражения содержаттолько однобайтовые символы ASCII, поэтому он должен работать на каждый ввод, независимо от кодировки, не так ли?Обратите внимание, что в третьем регулярном выражении используется оператор точки, но, поскольку я обрезал некоторые символы ASCII в начале и конце строки, это должно работать и в UTF-8, верно?

Не может ли кто-нибудь сказать мне, если я пропускаючто-то?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Нет проблем с первым выражением.Количественные символы являются явно однобайтовыми и не могут встречаться в многобайтовой последовательности UTF-8.

Второе выражение может дать вам больше пробелов, чем вы ожидаете;например:

echo preg_replace('/[^a-zA-Z0-9]/', "0", "?");
// => 0000

Третье выражение также не представляет проблемы, так как повторяющийся символ ограничен скобками (что является безопасным для ASCII).

Это более опасно:

echo preg_replace('/^(.)/', "0", "?");
// => 0???

Как правило, не зная больше о том, как работает UTF-8, может быть сложно предсказать, какие регулярные выражения безопасны, а какие нет, поэтому используйте /u для всего текста, который может содержать символ вышеU + 007F - лучшая практика.

0 голосов
/ 26 сентября 2019

u (PCRE_UTF8)
Этот модификатор включает дополнительные функции PCRE, несовместимые с Perl.Шаблонные и предметные строки рассматриваются как UTF-8.Недопустимый субъект приведет к тому, что функция preg_ * ничего не найдет;неверный шаблон вызовет ошибку уровня E_WARNING.Последовательности UTF-8 с пятью и шестью октетами считаются недействительными начиная с PHP 5.3.4 (соответственно PCRE 7.3 2007-08-28);ранее они считались действительными UTF-8.

Это понадобится вам, когда вам нужно сравнить символы Юникода, например корейский или японский.

Другими словами, если только выВы не сравниваете строки, которые не являются Unicode (например, английский), Вам не нужно использовать этот флаг.

...