У меня есть старая конфигурация сервера LAMP под управлением apache + php + ubuntu10 трех-четырехлетней давности, а также новая рабочая версия для подготовки к обновлению всего с помощью последней версии php 5.5.9 и apache / 2.4.7, работающей на ubuntu 14.
На сайте у меня есть preg_match, оценивающее выражение, чтобы проанализировать некоторые URL-адреса, которые имеют URL-адреса как на основе ASCII, так и на основе Unicode. У меня не так много вариантов касания и изменения фактического выражения, но я могу манипулировать тестовой строкой.
Для этого вопроса у меня есть следующее выражение, которое возвращает истину на старом сервере, но не на производственном сайте:
preg_match('#^/(?<controller>[-_a-zA-Z\p{L}]+)$#','/Гtest')
Однако строки, не поддерживающие Юникод, оцениваются как true на производственном сайте, таком как эта строка:
preg_match('#^/(?<controller>[-_a-zA-Z\p{L}]+)$#','/test')
Также производственный сайт правильно оценивает выражение как true, если я удаляю ^ (начало строки) и $ (конец строки) в выражении как таковое:
preg_match('#/(?<controller>[-_a-zA-Z\p{L}]+)#','/Гtest')
Нужно ли изменить конфигурацию сервера или что-то еще, что я могу сделать, чтобы первый пример работал на рабочем сайте?
Для сопоставления с юникодом вам нужно использовать / u:
preg_match('#^/(?<controller>[-_a-zA-Z\p{L}]+)$#u','/Гtest')
В вашем примере вы используете unicode в regexp, поэтому можете пропустить его, но всегда помните об этом.
Также вам нужно определить вашу среду php. Вы можете сделать это через php.ini:
mbstring.internal_encoding = UTF-8
Или добавьте эту строку поверх вашего php:
<?php
mb_internal_encoding("UTF-8");
...
Других решений пока нет …