Я хочу преобразовать набор кодов Unicode в строковый формат в фактические символы и / или объекты HTML (либо результат в порядке).
Например, если у меня есть следующее назначение строки:
$str = '\u304a\u306f\u3088\u3046';
Я хочу использовать функцию preg_replace
для преобразования этих кодов Unicode в фактические символы и / или объекты HTML.
Как и в других сообщениях переполнения стека, которые я видел по аналогичным вопросам, я сначала попытался сделать следующее:
$str = '\u304a\u306f\u3088\u3046'; $str2 = preg_replace('/\u[0-9a-f]+/', '&#x$1;', $str);
Однако, когда я пытаюсь сделать это, я получаю следующую ошибку PHP:
Предупреждение: preg_replace () [function.preg-replace]: Ошибка компиляции: PCRE не поддерживает \ L, \ l, \ N, \ U или \ u
Я пробовал всевозможные вещи, такие как добавление флага u
в регулярное выражение или изменение /\u[0-9a-f]+/
to /\x{[0-9a-f]+}/
, но ничего не работает.
Кроме того, я просмотрел всевозможные другие релевантные страницы / сообщения, которые я мог найти в Интернете, связанные с преобразованием кодовых точек Юникода в реальные символы в PHP, но либо я пропустил что-то важное, либо что-то не так, t исправить проблему, которую я имею.
Может ли кто-нибудь предложить мне конкретное решение о том, как преобразовать строку кодов Unicode в реальные символы и / или строку объектов HTML?
Из руководства по PHP :
Отдельные и двойные кавычки строк PHP имеют особое значение обратного слэша. Таким образом, если
\
нужно сопоставить с регулярным выражением\\
, то в PHP-коде необходимо использовать"\\\\"
или'\\\\'
.
Прежде всего, в вашем регулярном выражении вы используете только одну обратную косую черту ( \
). Как объяснено в руководстве PHP, вам нужно использовать \\\\
для соответствия буквальной обратной косой черты ( за некоторыми исключениями ).
Во-вторых, вам не хватает групп захвата в исходном выражении. preg_replace()
выполняет поиск в заданной строке для совпадений с предоставленным шаблоном и возвращает строку, в которой содержимое, сопоставляемое группами захвата, заменяется заменяющей строкой.
Обновленное регулярное выражение с правильными экранами и правильными группами захвата будет выглядеть так:
$str2 = preg_replace('/\\\\u([0-9a-f]+)/i', '&#x$1;', $str);
Вывод:
おはよう
Выражение: \\\\u([0-9a-f]+)
\\\\
– соответствует литеральной обратной косой чертой u
– соответствует буквенному символу u
(
– начало группы захвата
[0-9a-f]
– класс символов – соответствует цифре ( 0
– 9
) или алфавиту (от a
– f
) один или несколько раз )
– конец группы захвата i
– используется для нечувствительности к регистру Замена: &#x$1
&
– буквальный символ амперсанда ( &
) #
– буквальный символ фунта ( #
) x
– буквальный символ x
$1
– содержимое первой группы захвата – в этом случае, строки формы 304a
и т. Д. Демоверсия RegExr.
Эта страница здесь, озаглавленная «Escapeing Unicode Characters to HTML Entities» в PHP, – это решение этой приятной функции:
function unicode_escape_sequences($str){ $working = json_encode($str); $working = preg_replace('/\\\u([0-9a-z]{4})/', '&#x$1;', $working); return json_decode($working); }
Это похоже на json_encode
и json_decode
для получения чистого UTF-8 и преобразования его в Unicode. Очень хорошая техника. Но для вашего примера это сработает.
$str = '\u304a\u306f\u3088\u3046'; echo preg_replace('/\\\u([0-9a-z]{4})/', '&#x$1;', $str);
Выход:
おはよう
Который:
お は よ う
Что означает:
Доброе утро