PHPでwordpressの記事のタイトルの先頭8文字をカットして抜き出したいのですが、出力が10進数になってしまいます。


||<
$en_name0 = get_the_title();
//タイトルから特殊記号文字を空文字('')に置き換える
$formated_name = preg_replace('/[^ぁ-んァ-ンーa-zA-Z0-9一-龠0-9\-\r]+/u','' ,$en_name0);
$formated_name = mb_convert_encoding($formated_name, 'UTF-8', 'auto') ;
$en_name = mb_substr($formated_name, 0, 8,"UTF-8" ) . "\n"; ; //タイトル先頭から文字切り出す
>||

例えば、「北朝鮮ミサイル発射の失敗」 というタイトルが
21271263 という数字(10進数?)
になってしまいます。

原因がわかりますでしょうか。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2017/05/31 13:05:03

回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

例えば、「北朝鮮ミサイル発射の失敗」 というタイトルが
21271263 という数字(10進数?)
になってしまいます。

21271 は、「北」の UTF-8 の文字コード(十進数)なので、get_the_title で取得した記事のタイトルが数値参照の表現になっていると想像します。
mb_convert_encoding を使って、数値参照の表現を通常の文字に直してから使えば良いと思います。

<?php
    $en_name0 = get_the_title();
    // "&#21271;&#26397;&#39854; ..." というような文字列になってるはず
    // ↓これを追加
    $en_name0 = mb_convert_encoding($en_name0, 'UTF-8', 'HTML-ENTITIES');

    //タイトルから特殊記号文字を空文字('')に置き換える
    $formated_name = preg_replace('/[^ぁ-んァ-ンーa-zA-Z0-9一-龠0-9\-\r]+/u','' ,$en_name0);
// ↓要らない
//  $formated_name = mb_convert_encoding($formated_name, 'UTF-8', 'auto') ;
    $en_name = mb_substr($formated_name, 0, 8,"UTF-8" ) . "\n"; ; //タイトル先頭から文字切り出す
        ...
他3件のコメントを見る
id:a-kuma3

mb_convert_encoding だと、数値参照以外を受け付けないのですね。
"&#" が含まれているかどうかを判定するという方法もあると思いますが、こちらの関数を使う手もありそうです。
http://php.net/manual/ja/function.mb-decode-numericentity.php

第2引数がもやっとする感じですが、こんな感じで行けると思います。

<?php
    ...
//  $en_name0 = mb_convert_encoding($en_name0, 'UTF-8', 'HTML-ENTITIES');
    $en_name0 = mb_decode_numericentity($en_name0, array(0x0, 0xffff, 0, 0xffff), 'UTF-8');
2017/05/24 23:25:49
id:kajironpu

返信が遅くなり申し訳ありません。ありがとうございました。mb_decode_numericentityでうまくいきました。
この引数の部分が呪文のようです。。。これは変換する範囲を表しているのですね。とても勉強になりました。ありがとうございました。

2017/05/26 09:49:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません