Не могу понять разницу между двумя шаблонами preg_match - PullRequest
1 голос
/ 25 января 2012

в оригинальном коде (модуль ядра Drupal) предыдущий разработчик закомментировал строку:

if (preg_match('/[^\x{80}-\x{F7} a-z0-9@_.\'-]/i', $name)) {

и вместо этого добавил:

if (preg_match('/[^\x{80}-\x{F7} a-z0-9@_.\'-]/iu', $name)) {

Можете ли вы помочь мне понять, чторазница между этими двумя?Что делает модификатор u?В php документах я нашел:

u (PCRE8)
Этот модификатор включает дополнительную функциональность PCRE, несовместимую с Perl.Строки шаблона рассматриваются как UTF-8.Этот модификатор доступен из PHP 4.1.0 или выше в Unix и из PHP 4.2.3 в win32.UTF-8 проверяет правильность шаблона начиная с PHP 4.3.5.

Так что, я думаю, предыдущий разработчик имел проблемы с интерпретацией специальных символов или чем-то еще.Я немного озадачен, пожалуйста, совет по этому поводу.

Ответы [ 2 ]

4 голосов
/ 25 января 2012

Модификатор необходим для правильной обработки кодированного ввода utf-8. Шаблон типа \ xC1 должен соответствовать символу Unicode U + 00C1 (À). Когда вы кодируете Á в utf-8, вы получаете \ xC3 \ x81, поэтому \ xC1 не совпадает. Модификатор "u" заставляет алгоритм использовать utf-8, поэтому он совпадает.

В основном, когда вы работаете с текстом в кодировке utf-8, это то, что произойдет:

<?php
var_dump(preg_match('/\xC1/u', 'Á'));
// => int(1), matches

var_dump(preg_match('/\xC1/', 'Á'));
// => int(0), doesn't match
?>

В вашем случае первое регулярное выражение [^ \ x80- \ xF7] не соответствует ни одному (не ascii) тексту в кодировке UTF-8 из-за способа работы UTF-8. Второе выражение соответствует символам Юникода вне диапазона U + 0080 - U + 00F7, поэтому оно пропускает все кириллицу, греческий, арабский, иврит, ...

0 голосов
/ 25 января 2012

u - означает, что preg match будет проверяться на наличие строки UTF-8, а не только iso-8859-1, например AZ

eq

$what = 'łódka - русский алфавит';

if ( preg_match_all('#([\w A-Za-z])#u',$what,$res) ) :
echo  'math eq' .  'łódka - русский алфавит';
endif;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...