人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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進数?)
になってしまいます。

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

●質問者: kajironpu
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3

例えば、「北朝鮮ミサイル発射の失敗」 というタイトルが
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"; ; //タイトル先頭から文字切り出す
 ...

kajironpuさんのコメント
a-kuma3さん、さっそくありがとうございました。うまくいきました。 タイトルの出力はちゃんと文字なのに、それを加工すると数値の表現になっている場合もあるのですね、、タイトルから動画を検索させようとしていますがなかなかうまくいきません。タイトルからメインキーワードだけをひろってきて、それで検索をかけたりできたらいいのですが、難しそうですね。また調べながらチャレンジしてみたいと思います。

a-kuma3さんのコメント
数値参照なんかはブラウザが解釈してくれます。 なのでWebサーバから受け取った後(見た目や javascript)は意識しなくて済むのですが、ブラウザに渡す前(サーバサイドの php なんか)は意識してプログラムする必要があります。 [https://core.trac.wordpress.org/browser/tags/4.7.5/src/wp-includes/post-template.php#L110:title=get_the_title のソース]を見る限りでは、わざわざ数値参照にしているふうには見えないので、 - DB に数値参照で入ってる - テーマでフィルタを登録して、そこがやってる のどちらかかなあ、というような気がしてます。。

kajironpuさんのコメント
ありがとうございます。データベースに数値として入っているかもですね ところで、その後もう一度確認したのですが、先ほどのコードだと数値参照のものはうまく文字抜きだしできたのですが、今度は、もともと文字としてタイトルに入っているほうが、うまくいかなくなってしまいました。試しに$en_name0を出力させてみると中身は空でした。不思議です。 この場合、タイトルから持ってきた$en_name0の中身が数値参照かどうかでif文でエンコードする、しないを分けるたほうがいいのでしょうか?

a-kuma3さんのコメント
mb_convert_encoding だと、数値参照以外を受け付けないのですね。 "&amp;#" が含まれているかどうかを判定するという方法もあると思いますが、こちらの関数を使う手もありそうです。 http://php.net/manual/ja/function.mb-decode-numericentity.php 第2引数がもやっとする感じですが、こんな感じで行けると思います。 >|php| <?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'); ||<

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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ