Даже в режиме UTF-8 предопределенные классы символов, такие как \d
и [[:digit:]]
, соответствуют только символам ASCII.Чтобы сопоставить потенциально не ASCII-цифры, вы должны использовать эквивалентное свойство Unicode, \p{Nd}
:
$s = "12345\xD9\xA1\xD9\xA2\xD9\xA3\xD9\xA4\xD9\xA5";
preg_match_all('~\p{Nd}{5}~u', $s, $matches);
См. Его в действии на ideone.com
вам нужно сопоставить определенные символы или диапазоны, вы можете использовать escape-последовательность \x{HHHH}
с соответствующими кодовыми точками:
preg_match_all('~[\x{0661}-\x{0665}]{5}~u', $s, $matches);
... или использовать форму \xHH
для ввода их UTF-8закодированные последовательности байтов:
preg_match_all("~[\xD9\xA1-\xD9\xA5]{5}~u", $s, $matches);
Обратите внимание, что я переключился на двойные кавычки для этого последнего примера.Формы \p{}
и \x{}
были переданы для обработки компилятором regex, но на этот раз мы хотим, чтобы компилятор PHP расширил escape-последовательности.Этого не происходит в одиночных кавычках.