regex — Сбой выражения Unicode в preg_match после обновления php и apache

У меня есть старая конфигурация сервера 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')

Нужно ли изменить конфигурацию сервера или что-то еще, что я могу сделать, чтобы первый пример работал на рабочем сайте?

1

Решение

Для сопоставления с юникодом вам нужно использовать / 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");
...
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]