От чего зависит флаг preg_match_all `u`? - PullRequest
6 голосов
/ 17 сентября 2011

У меня есть некоторый код в приложении PHP, который возвращает null, когда я пытаюсь использовать его на рабочем сервере, но он отлично работает на сервере разработки. Вот строка кода:

// use the regex unicode support to separate the UTF-8 characters into an array
preg_match_all( '/./us', $str, $match );

От чего зависит флаг u? Я тестировал с включенным и отключенным mb_string, и это, похоже, не влияет на него.

Я получаю ошибку

preg_match_all: Compilation failed: unknown option bit(s) set at offset -1

подробнее

это один из параметров на сервере prodction:

'--with-pcre-regex=/opt/pcre'

и вот разделы pcre

Picture.png http://img829.imageshack.us/img829/8524/pictureke.png

Я полагаю, что это примечание, о котором говорил Уэсли:

In  order  process  UTF-8 strings, you must build PCRE to include UTF-8
support in the code, and, in addition,  you  must  call  pcre_compile()
with  the  PCRE_UTF8  option  flag,  or the pattern must start with the
sequence (*UTF8). When either of these is the case,  both  the  pattern
and  any  subject  strings  that  are matched against it are treated as
UTF-8 strings instead of strings of 1-byte characters.

Есть ли ссылки или советы о том, как "собрать PCRE для включения UTF-8"?

через

Результаты pcretest -C

PCRE version 6.6 06-Feb-2006
Compiled with
  UTF-8 support
  Unicode properties support
  Newline character is LF
  Internal link size = 2
  POSIX malloc threshold = 10
  Default match limit = 10000000
  Default recursion depth limit = 10000000
  Match recursion uses stack

Ответы [ 2 ]

5 голосов
/ 17 сентября 2011

Этот флаг зависит от того, какой PCRE собирается с поддержкой юникода.

PHP связывает эту библиотеку, и она обычно создается с включенной поддержкой юникода: модификатор u доступен и всегда работает с PHP 4.1.0, когда PHP создается с помощью связанной библиотеки PCRE.

Однако некоторые дистрибутивы Linux собирают PHP на основе собственной сборки PCRE, для которой не включена поддержка юникода, и в результате модификатор u не работает на этих сборках.

Решение состоит в том, чтобы использовать альтернативный пакет PHP.

1 голос
/ 17 сентября 2011

Это зависит от того, какой PCRE компилируется с --enable-utf8.

...