メモしよっと

なんでもメモするブログです。

(一応解決)postデータの絵文字のみをHTMLエンティティに変換したかった - PHP

悩んだこと

ユーザーの入力値とテーブルに格納されている文字列とを比較して、検索を行いたかった。 絵文字はテーブルに数値文字参照(10進)で格納されているが、入力値の絵文字部分だけ数値文字参照(10進)にする方法が分からなかった。

やりたいこと・条件

  • DB(MySQL)の文字コードEUC-JP
  • ユーザーが入力した値を検索条件に、完全一致するレコードを抽出する
  • 絵文字はテーブルに数値文字参照(10進)で格納されている

やったこと

入力値をUTF-8で受け取り、EUC-JPに変換。その際扱えない文字をHTMLエンティティに置きかえる。


<?php
$substrchar = mb_substitute_character();
mb_substitute_character('entity');
$post_text = mb_convert_encoding($post_text, "cp51932, "UTF-8");
mb_substitute_character($substrchar);

この時$textを出力すると、絵文字は16進の数値文字参照に置き換わっていた。 要件は10進数なので、正規表現で更に変換。


<?php
$ptn = "/(&#x[0-9a-zA-Z]+;)/";
$post_text = preg_replace_callback($ptn, function ($matches) {
            $hex_entity = $matches[0];
            return "&#".hexdec(substr($hex_entity, 3, -1)).";";
        }, $post_text);

もっと良い方法もあるのかもしれない