Предупреждение: preg_match (): внутренняя pcre_fullinfo () - PullRequest
17 голосов
/ 14 января 2012

У меня есть следующий рабочий код:

$test = '123456';

$int = preg_match('/^\d+$/', $test, $matches);

print_r(array($int, $matches));

Однако, когда я выполняю его на кодовой панели , я получаю сообщение об ошибке:

Предупреждение: preg_match (): внутренняя ошибка pcre_fullinfo () -3 в строке 5

Но код работает на моей собственной машине (и ИМХО этот код должен быть в порядке).

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

1 Ответ

30 голосов
/ 14 января 2012

Код, выполняемый через кодовую панель, выполняется в очень ограниченной среде:

Выполнение кода осуществляется руководителем на основе geordi. Стратегия состоит в том, чтобы запускать все под ptrace, при этом многие системные вызовы запрещены или игнорируются . Компиляторы и финальные исполняемые файлы выполняются в изолированной тюрьме со строгим ограничением ресурсов. Руководитель написан на Хаскеле.

Хотя вы и не ожидаете, что сломаете движок регулярных выражений, вполне возможно, что библиотека pcre использует что-то внутренне, что блокируется средой кодовой панели. Ни одна производственная система не использует такие строгие ограничения, поэтому вы должны безопасно использовать этот код в своем приложении.

Код ошибки означает «PCRE_ERROR_BADOPTION - значение что недопустимо». Тем не менее, код в исходном коде PHP, где происходит ошибка, является rc = pcre_fullinfo(pce->re, extra, PCRE_INFO_CAPTURECOUNT, &num_subpats);, который использует константу для что . Таким образом, это ясно означает, что библиотека pcre не работает на кодовой панели.

Если вы хотите быть в полной безопасности, вы можете написать небольшую программу на C, используя libpcre, для вызова этой функции в том же регулярном выражении.

...