Даже в режиме 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);
See it in action on ideone.com
Если вам нужно, чтобы соответствовать определенным символам или диапазоны, вы можете использовать либо последовательность \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{}
были переданы для обработки компилятором регулярных выражений, но на этот раз мы хотим, чтобы компилятор расширял escape-последовательности. Это не происходит в строках с одной кавычкой.
Любой шанс вы можете вставить свой ошибочный '$ input'? Мне очень интересно видеть эту ошибку. –