preg_replace не принимает юникод

Я пытаюсь сохранить только допустимые символы и символы Unicode на иврите из строки, используя preg_replace.

Я получаю сообщение об ошибке в этой строке:

$PLAINText1 = preg_replace('/[^(\x20-\x7F),(\x05D0-\x05F2)]*/','', $PLAINText);

Ошибка:

Сбой компиляции: неправильный диапазон в классе символов по смещению 25 дюймов....

Я уже знаю, что ошибка только в этой фразе: (\x05D0-\x05F2)

Я прочитал много сообщений об этой проблеме здесь и не нашел решения. В одном соответствующем сообщении предлагалось добавить } к Unicode, поэтому в этой строке:

$PLAINText1 = preg_replace('/[^(\x20-\x7F),(\x{05D0}-\x{05F2})]*/','', $PLAINText);

Я получаю другую ошибку:

значение символа в последовательности \x{...} слишком велико по смещению 22...

Пожалуйста помоги.


person Rodniko    schedule 12.06.2013    source источник


Ответы (4)


\x принимает только две шестнадцатеричные цифры, поэтому ваш диапазон переводится как «символ ENQ, D, что-то между 0 и ENQ (это ошибка), F или 2»

Попробуйте добавить модификатор Unicode u в конец вашего регулярного выражения и используйте \x{05D0}, чтобы явно указать, сколько символов использовать в качестве шестнадцатеричного числа.

person Niet the Dark Absol    schedule 12.06.2013
comment
я пробовал это, он ничего не возвращает, без текста и без ошибок: $PLAINText1 = preg_replace('/[^(\x20-\x7F),(\x{05D0}-\x{05F2})]*/u', '', $PLAINText); - person Rodniko; 13.06.2013
comment
также пробовал: $PLAINText1 = preg_replace('/[^(\x{0020}-\x{007F}),(\x{05D0}-\x{05F2})]*/u','', $PLAINText ); еще ничего... - person Rodniko; 13.06.2013

Кстати, вы можете использовать допустимые символы иврита с помощью: \p{Hebrew} и избегать их с помощью \P{Hebrew}.

person Casimir et Hippolyte    schedule 12.06.2013

вы должны изменить кодировку файла на utf 8, например: notepad ++ перейдите к кодировке -> кодировать в UTF-8, и он должен работать: preg_replace('/[^\p{Hebrew}a-zA-Z0-9_ %[].()&-]/u','', $q) Я также добавил «u» в качестве модификатора.

person Mor    schedule 06.01.2015

Ниже будут заменены любые символы Юникода, кроме буквенно-цифровых, иврита и подчеркивания.

$foo = preg_replace('/[^\w\x{05D0}-\x{05F2}]+/u', '', $foo);  

И ниже заменит любые символы Юникода, кроме символов ASCII от 20 до 127 и иврита.

$foo = preg_replace('/[^\x{20}-\x{7F}\x{05D0}-\x{05F2}]+/u', '', $foo);
person D-R-M    schedule 10.12.2017