PHP5.3 preg_match с Umlaute UTF-8-модификатором - PullRequest
2 голосов
/ 18 января 2012

следующая команда возвращает true на сервере PHP5.3.8 Lamp (Ubuntu 11.04) -Server, но false на сервере PHP5.3.2 Lamp (Ubuntu 10.04.2 LTS) -Server.

<?php echo preg_match('/\w/u', 'ß'); ?>

Я почти изменил все настройки в php.ini-файле, но безуспешно. Я изменил системный язык на en_US.UTF-8 и сделал его языком по умолчанию для PHP. Кроме того, я попробовал de_DE.UTF-8-locale.

В обоих случаях я использую пакеты по умолчанию, предоставляемые ubuntu.

У кого-нибудь есть другая идея, что изменить, не компилируя пакеты, чтобы PHP5.3.2 также возвращал true?

Ответы [ 2 ]

6 голосов
/ 19 января 2012

PHP 5.3.2 использует PCRE 8.00, тогда как PHP 5.3.8 использует PCRE 8.11. Одно изменение в PCRE 8.10 было добавлено PCRE_UCP * 1007.* option :

PCRE_UCP

Этот параметр изменяет способ обработки PCRE \B, \b, \D, \d, \S, \s, \W, \w и некоторые классы символов POSIX.По умолчанию распознаются только символы ASCII, но если установлено PCRE_UCP , вместо них используются свойства Unicode для классификации символов.Более подробная информация приведена в разделе об общих типах символов на странице pcrepattern.Если вы установите PCRE_UCP , сопоставление одного из элементов, на которые он влияет, займет гораздо больше времени.Опция доступна только в том случае, если PCRE был скомпилирован с поддержкой свойств Unicode.

К сожалению, вы не можете вызвать эту опцию напрямую с помощью модификатора шаблона в PHP.Он будет установлен u вместе с PCRE_UTF8 , если доступно (PHP 5.3.4 и более поздние версии).

0 голосов
/ 25 августа 2012

Unicode еще не полностью поддерживается в php

следующий код

$url='abc αβγ';
define('CONST_REGEX_SANITIZE_URL', '/[^\040\w\/\.\-\:]/u');
$invalid_url = preg_match(CONST_REGEX_SANITIZE_URL, $url) ? 'true' : 'false';
echo $invalid_url;

вернуть 'false' с php> 5.3.10

и 'true' с php <5.3.3 (кстати, текущая версия PHP Debian) </p>

...