Как я могу использовать функцию preg_replace PHP для преобразования кодовых точек Unicode в реальные символы / объекты HTML?

Я хочу преобразовать набор кодов 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] – класс символов – соответствует цифре ( 09 ) или алфавиту (от af ) один или несколько раз
  • ) – конец группы захвата
  • 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); 

Выход:

 おはよう 

Который:

お は よ う

Что означает:

Доброе утро