PCRE in PHP unicode support

xlex

Guest
PCRE in PHP unicode support

Кто-нибудь использует Perl-овские регулярные выражения с unicodе? Работает?
Сам PCRE lib unicode (utf-8) поддерживает, а как насчёт PHP extension-а на этот счёт?
 

xlex

Guest
Не хватает - нужны именно PCRE. Но там в одном комменте написано что с unicode это чудо не работает. Написанно достаточно давно + сама библиотека поддерживает, в связи с чем интересно - починили или нет.
 

xlex

Guest
Не починили...
Посмотрел исходник - в качестве строки передаётся char*... Современный язык, блин.
 

SiMM

Новичок
> Кто-нибудь использует Perl-овские регулярные выражения с unicodе? Работает?
Надо то что? Не вижу причин не работать, разве что диапазоны типа А-Яа-я задавать не так удобно, да и про модификатор i лучше забыть :) UTF-8 как нельзя кстати подходит.
 

xlex

Guest
Надо чтобы это нормально работало и учитывало особенности того, что один знак может занимать один, два или более байтов...

Буду POSIX-овскими обходиться.
 

tony2001

TeaM PHPClub
>Сам PCRE lib unicode (utf-8) поддерживает, а как насчёт PHP extension-а на этот счёт?
точно так же.
ext/pcre - просто враппер к PCRE.

в bundled pcre 4.5 достаточно ограниченная поддержка Unicode, вероятно, придется собирать с внешней, более новой либой.
 

xlex

Guest
tony2001,
по идее - да, также, но вот, например, функция:

=============================================
/* {{{ php_pcre_replace
*/
PHPAPI char *php_pcre_replace(char *regex, int regex_len,
char *subject, int subject_len,
zval *replace_val, int is_callable_replace,
int *result_len, int limit TSRMLS_DC)
{
pcre *re = NULL; /* Compiled regular expression */
pcre_extra *extra = NULL; /* Holds results of studying */
int exoptions = 0; /* Execution options */
int preg_options = 0; /* Custom preg options */
int count = 0; /* Count of matched subpatterns */
int *offsets; /* Array of subpattern offsets */
int size_offsets; /* Size of the offsets array */
int new_len; /* Length of needed storage */
int alloc_len; /* Actual allocated length */
int eval_result_len=0; /* Length of the eval'ed or
function-returned string */
int match_len; /* Length of the current match */
int backref; /* Backreference number */
int eval; /* If the replacement string should be eval'ed */
int start_offset; /* Where the new search starts */
int g_notempty=0; /* If the match should not be empty */
int replace_len=0; /* Length of replacement string */
char *result, /* Result of replacement */
*replace=NULL, /* Replacement string */
*new_buf, /* Temporary buffer for re-allocation */
*walkbuf, /* Location of current replacement in the result */
*walk, /* Used to walk the replacement string */
*match, /* The current match */
*piece, /* The current piece of subject */
*replace_end=NULL, /* End of replacement string */
*eval_result, /* Result of eval or custom function */
walk_last; /* Last walked character */
int rc;
=============================================

И, например, 'replacement string' определён как char* - по-моему, это не вписывается в поддержку unicode...

А вот насчёт bundled 4.5 и откуда взять внешнюю (более новую) - можно поподробнее?
Вообще как прикрутить к PHP сколь-либо нормальную поддержку Unicode (кроме mb_* функций)? Можно ткнуть на доку/ресурс какой?

Заранее огромное человеческое!
 

tony2001

TeaM PHPClub
>И, например, 'replacement string' определён как char* - по-моему, это не
>вписывается в поддержку unicode...

чем конкретно?

>А вот насчёт bundled 4.5 и откуда взять внешнюю (более новую) - можно
>поподробнее?

google.com -> pcre.org

>Вообще как прикрутить к PHP сколь-либо нормальную поддержку Unicode (кроме
>mb_* функций)? Можно ткнуть на доку/ресурс какой?

"нормальная" поддержка - это в переводе что означает?
 

xlex

Guest
Насчёт char-а - тем, что char может хранить один байт. И если только они не прикрутили какой-то специальный обработчик потока байтов, чтобы определять что есть символ (чему я буду только рад), то этот вариант просто не будет работать (например, резать символы пополам).

pcre.org я знаю, только в данном случае это тут при чём? bundled 4.5 - это версия extension, а версия библиотеки, при этом, например, у меня 5.0.3. Я думал может есть более новая версия экстеншиона.

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

Оговорюсь сразу: о возможных проблемах сужу по сообщениям на форумах и обменом опытом других людей - сам не хочу получить те же проблемы, потому и спрашиваю.

-~{}~ 07.02.05 22:50:

Пардон, виноват, дурак: насчёт 4.5 / 5.0 - всё понял (покопался в папке экстеншиона).

Вопрос как прикрутить 5.0?
 

tony2001

TeaM PHPClub
>Насчёт char-а - тем, что char может хранить один байт.
там char *, а не char.

>pcre.org я знаю, только в данном случае это тут при чём?
>bundled 4.5 - это версия extension, а версия библиотеки, при этом, например, у
>меня 5.0.3. Я думал может есть более новая версия экстеншиона.
эстеншену все равно с какой версией либы работать до тех пор, пока версии совместимы.
у тебя каша в голове: 4.5 - это версия bundled pcrelib.
собери с --with-pcre-regex=/путь/к/внешней/либе и будет использоваться она.

>Нормальная поддержка обозначает, что чтобы это работало, без граблей (вроде
>вышеупомянутого обрезания символов).
там нет никакого обрезания символов.

>Вопрос как прикрутить 5.0?
--with-pcre-regex=[DIR]
 

AnToXa

prodigy-одаренный ребенок
Насчёт char-а - тем, что char может хранить один байт. И если только они не прикрутили какой-то специальный обработчик потока байтов, чтобы определять что есть символ (чему я буду только рад), то этот вариант просто не будет работать (например, резать символы пополам).
да, конечно разбор потока, а как еще? black magic ?
 

xlex

Guest
tony2001,
>там char *, а не char
Я заметил ;)

>у тебя каша в голове: 4.5 - это версия bundled pcrelib
Уже понял, честно признался и повинился... =)

>--with-pcre-regex
Спасибо - так и сделаю.

AnToXa,
как вариант использование unsigned int вместо char (встречал такое в некоторых исходниках). Насколько я помню, pcre lib именно так и делает...
 

SiMM

Новичок
> как вариант использование unsigned int вместо char (встречал такое в некоторых исходниках)
А кто сказал, что UTF-8 помещается в int?

>> там char *, а не char
> Я заметил
Тогда к чему такие странные догадки? Это всего лишь указатель.
 

xlex

Guest
unsigned int - 2 или бита, потому шансов на это гораздо больше.

Насчёт char/char* - указатель на массив переменых типа char.

Чего-то, видимо, у меня всё-таки каша в голове, будет время - надо будет разобраться получше...

Спасибо всем, что прояснили ситуацию!

-~{}~ 08.02.05 19:23:

Тихо сам с собой...

Обнаружил такую страницу http://ru2.php.net/manual/en/reference.pcre.pattern.modifiers.php и там:
"u (PCRE_UTF8)
This modifier turns on additional functionality of PCRE that s incompatible with Perl. Pattern strings are treated as UTF-8. This modifier is available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32."
 
Сверху