Как разрешить символу «окина» проходить через диапазон в preg_replace()?

Мне нужно разрешить символ 'okina с помощью следующего кода

<?php $char = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\xFF]/u', '', $char); ?>

Я пытался найти четкое объяснение того, как здесь работают диапазоны и как выбрать одну букву из диапазона, но безуспешно. Как я могу это сделать?

Спасибо


person awolfey    schedule 15.11.2012    source источник


Ответы (2)


Символ, на который вы ссылаетесь, представляет собой БУКВУ-МОДИФИКАТОР, ЗАПОЛНЕННУЮ ЗАПЯТОЙ (U+02BB), которая описана в стандарте Unicode как «используемая в гавайской орфографии как окина (гортанная смычка)». Можно возразить, что это самая правильная окина, но, конечно же, это не единственный иероглиф, используемый для этой цели. Довольно часто «окина» пишется как правая одинарная кавычка «U+2019», левая одинарная кавычка «U+2018», апостроф (Ascii) «U+0027» или строгий ударение «U+0060».

Но, учитывая U+02BB, это можно записать в регулярном выражении PHP как \x{02bb}. Объяснение обозначения см. в разделе Как заменить символы вне диапазона [0x5E10, 0x7F35] на '*' в PHP?

person Jukka K. Korpela    schedule 15.11.2012

Поскольку ваше регулярное выражение блокирует только «определенные» символы длиной один байт или меньше, оно не может блокировать символ okina, поскольку он является двухбайтовым символом. Итак, я предлагаю вам попробовать это регулярное выражение:

<?php $char = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/u', '', $char); ?>

и пропустите все символы x80-xFF и посмотрите, решит ли это вашу проблему.

Если это так, это, вероятно, «левая одинарная кавычка» (x91 в западном наборе символов), которую вы путаете с окиной.

person keyboardSmasher    schedule 15.11.2012
comment
Это все еще заменяет его. Я, возможно, был неясен в своем вопросе. Я не хочу заменять окину. Я хочу, чтобы он оставался в строке. - person awolfey; 16.11.2012
comment
@awolfey попробуйте мою правку, чтобы увидеть, пропускает ли она вашего персонажа. - person keyboardSmasher; 16.11.2012