[Решено] Добавление модификатора /u
к регулярному выражению устраняет эту проблему, если кто-то борется с ней. Кредит М.И. в комментариях :)
Рассмотрим следующий код:
var_dump('Trimiteţi');
preg_match('/^([\p{L}]+)/', 'Trimiteţi', $matches);
print_r($matches);
Я использую его для фильтрации слова, которое может иметь нелатинские символы, используя \p{L}
, также обратите внимание, что я не использую символ регулярного выражения $
в конце строки в preg_match
Теперь к проблеме, при локальном выполнении кода я получаю этот вывод:
string 'Trimiteţi' (length=10)
Array ( [0] => TrimiteÅ [1] => TrimiteÅ )
Я попытался выполнить код в песочнице PHP и выдал что-то похожее:
string(10) "Trimiteţi"
Array
(
[0] => Trimite�
[1] => Trimite�
)
Обратите внимание, что по крайней мере на этот раз исходное слово var_dump
не испортилось.
Что здесь происходит? Почему использование preg_match меняет слово? Хуже всего то, что если я добавлю $
в конец регулярного выражения, оно будет НЕ СОВПАДИТЬ, так как я предполагаю, что эти преобразованные символы не могут быть интерпретированы как конец строки или что-то в этом роде. Пожалуйста помогите
Изменить: кодировка файла, которую я запускаю, установлена на "text/x-php; charset=utf-8"
Edit2: Кроме того, я использовал regex101.com, и при использовании РЕГУЛЯРНОГО ВЫРАЖЕНИЯ "^[\p{L}]+$" и слова "Trimiteţi" оно кажется совпадающим. Вы даже можете переключить РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ НА "^([\p{L}]+)$", добавив группу захвата, и сайт выведет:
MATCH 1
1. [0-9] `Trimiteţi`
preg_match('/^([\p{L}]+)/u', 'Trimiteţi', $matches);
- person M. I.   schedule 08.09.2016/u
помог, большое спасибо. Сделайте это как ответ, чтобы я мог отметить как правильный - person Arno   schedule 08.09.2016