トランスビットの開発ノート

Webサイト制作に役立つTipsやトラブルシューティングなどの備忘録

- php -

見出しタグと同じテキストをtitleタグに設定

ちょっとだけ題名を変えて、前回結論が出たやつを書いてみました。
やりたいことは↓です。

  1. headerやfooterはincludeして使いまわすため、header内のtitleタグを各ページに合わせて変化させたい。
  2. urlに対応するページタイトルを設定しておき、titleタグに書き加える。
function get_pagetitle(){

// 現在のurlを取得
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$domain = 'http://●●●●●/';
$pagetitle; // 入れ物

// 配列に、urlとページタイトルを入れておく
$pages = array (
  array ( 'href' => $domain.'cat.php', 'text' => '猫派' ),
  array ( 'href' => $domain.'dog.php', 'text' => '犬派' ),
  array ( 'href' => $domain.'bird.php', 'text' => '鳥派' )
);

// 配列の中で、現在のurlと対応するものを判別、その後、textを取得。
foreach($pages as $page){
  if($page['href'] == $url){
    $pagetitle = $page['text'];
  }
}
return $pagetitle;
}

これで、ページタイトルをゲットできるようになりました。
せっかくの配列なので、引数を設定したらfooter用のナビゲーションを書き出せるようにしてもいいかもです。

Filed under: , ,

見出しタグ内のテキストをtitleタグに設定

やりたいことは至って単純なんです。

  1. headerやfooterはincludeして使いまわすため、header内のtitleタグを各ページに合わせて変化させたい。
  2. 各ページには、見出しタグh2でページタイトルがついている。
  3. だから、それを取ってきてtitleタグに自動で書き加えたら楽な気がする!

jQueryなら簡単なんですが、titleをDOMで出すのは流石に良心が痛むので(SEO的に)、phpでやることにしてググってみました。

↓↓ 辿り着いたありがたいサイトを参考にしてみました。
PHPでWEBページのタイトルを抜き出すサンプル

function get_pagetitle(){
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; //当該ページ
$html = file_get_contents($url); //HTML取得
// ↓マルチバイトencode。今回はもとからutf-8なので不要。
// $html = mb_convert_encoding($html, mb_internal_encoding(), "auto" ); 
if ( preg_match( "/<h2 class=\"page_title\">(.*?)<\/h2>/i", $html, $matches) ) {
    $pagetitle = $matches[1]; //h2を丸ごと取得
} else {
    return false;
}

return strip_tags($pagetitle); //タグを除いて、中身だけ返す
}

できたー!
できた……が、file_get_contentsを使わずに、現在のページを舐めることはできないの!?
そして、わかっていたけどpreg_matchの重さは異常!!
たった一つのタグを探し出すための仕掛けなのに……(TT

結論:ファイル名とタイトルの連想配列を作っといて、foreachするのが一番良いと思います。

Filed under: , ,

JSON形式のデータを用意してPHPで配列処理

すっかり春めいてまいりました。我が家の庭では、去年植えた枝垂れ桃が無事開花。
今日、郵便受けに入ってたフリーペーパーの星占い(よく当たる気がする)では、私の運勢も開花していました。

『学問の世界に誘われ、語学習得すると吉』

ええ、ちょうどJSONとPHPにイザナわれるところでしたから……orz

ということで、いつもメールフォームで郵便番号から住所入力したりするのにお世話になっているJSON。
↓food.json。こんな感じの構造です。

[
  {"food":"肉","name":"牛","kana":"ウシ","like":"2"},
  {"food":"肉","name":"鳥","kana":"トリ","like":"5"},
  {"food":"乳製品","name":"チーズ","kana":"チーズ","like":"5"},
  {"food":"乳製品","name":"ヨーグルト","kana":"ヨーグルト","like":"4"},
  {"food":"野菜","name":"ほうれん草","kana":"ホウレンソウ","like":"3"}
]

今回はデータがExcelで用意されていたので、ソートを済ませてからマクロ使ってJSONに落としました。
上記の例だと、第一キーがfoodで、第二キーがkanaですね。
私はstabuckyさんのマクロを使わせてもらいましたが、ググッたら結構出てくるのでお好きなのを。
ExcelのテーブルをJSON形式に変換するマクロ | You Look Too Cool

出来上がったJSONがUTF-8無印で保存されているか確認してサーバにアップします。
ちなみに私はBOM付いててハマりました。元がExcelなんだから当然チェックすべきポイントですな……反省。

次はPHPでJSONを配列として扱うために、json_decode()を使います。

$url = "json/food.json";
$json = file_get_contents($url);
$food = json_decode($json,true);

echo var_dump($food); //NULLならBOM付いてるかも

ちゃんとdumpできてたら、あとはお好きなように~です!

Filed under: ,

PHPでリンククリックしてファイルをダウンロード

今日、きゅうりを一本収穫しました。つやつやです。
「あ、今日できてる!」とか「明後日には食べれるかな~」とか言ってる今が一番楽しいです。
ちなみに去年は1苗から200本近く採れてしまい、配布や消費に勤しみました。まさにきゅうり地獄。
トランスビットの外の人は、「きゅうりの食べ過ぎで体が緑色になった気がする」とか言っていましたが……おかしいな。
補色の関係にあるトマトもたくさん食べたのに。

ということで、今日はブラウザでの収穫作業の話です。

画像に貼ったリンクをクリックすると、通常ブラウザで画像が開いてしまいます。
開かずにダウンロードさせるので思いつく方法といえば、右クリックメニューから「名前をつけてリンク先を保存」とかかな。
リンククリックで直接ダウンロードさせたい場合、PHPで画像をDLさせることができます。
download.phpを下記のような内容で作っておき、ダウンロードさせたいリンクにdownload.phpを指定&URLクエリストリングで画像ファイル名とかを渡してやれば、再利用可能でラブリーというわけです。

//ファイルのパス
$fpath = $_GET["ps"];
$fpath = $fpath.'.jpg';

//ファイル名
$fname = $_GET["fn"];
$fname = $fname.'.jpg';

//IE空DL対策
$data = file_get_contents($fpath) or die('ERROR:cannot get');

//いらんかも
mb_output_handler($fpath);// 文字化け対策
mb_output_handler($fname);// 文字化け対策

header('Cache-Control: public');
header('Pragma: public');
header('Content-Type:application/octet-stream');
header('Content-Disposition: attachment; filename="'. rawurlencode($fname) .'"');// 文字化け対策
header('Content-Length: '. strlen($data));// IE空DL対策。

ob_end_clean(); // これがないとファイルが破損して悲しいことになる
readfile($fpath);

今回は、WordpressでLitebox的なプラグインを使っていたので、URLに[.jpg]が入っていると問答無用で別ウインドウが開いてしまうため、拡張子を削ったファイルのパスをURLに渡しました。ついでにファイル名用の文字列(日本語・文字化け注意)も渡してます。それがpsとfnですね。拡張子は必要だから後で両方に付け足し。

いやー……久しぶりにIEに滅多打ちにされました。一時はどうなることかと。
参考にしたサイトはこちら。いつもながら、えらい人たちに助けられてます。
PHPのファイルダウンロードでファイル破損を防ぐ方法!
PHPでダウンロードしたファイルが0kbになってしまいます

Filed under:

PHPで値に「日本語」を含むか調べる(正規表現)

前回似たような記事を書いたとき、もしかしているかもなーと思いながらスルーしていたツケが……。

if(preg_match( "/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+/u", $str) ){
  // 「日本語」を含む時の処理
}else{
  // 「日本語」を含まない時の処理
}

Filed under: ,

PHPで値が「ひらがな」のみか調べる(正規表現)

WordPressで、Wp_User_Query関数を使ってmeta_queryで絞込みしようとしたら、抽出結果が予想外で盛大にハマりました……orz
あーでもないこーでもないと色々試したものの、どうにも糸口を見つけ出せず、やさぐれてネットサーフィンしてたら、ふと、クエリそのものに頼りすぎてることに気づきました。

フォームから受け取った変数の中身の文字列が「ひらがな」のみか否か。それによってmeta_queryをちょこちょこっと変更してやればいいだけだったわけです。
というわけで、下記がUTF-8で長音も含める場合の正規表現。

if(preg_match("/^[ぁ-んー]+$/u",$str)){
  // 「ひらがな」のみの時の処理
}else{
  // 「ひらがな」だけじゃない時の処理
}

いつも思います。
たったこれだけのことで……バカ!(TT

Filed under: ,

PHPでディレクトリを扱う

随分前に桜が散ったというのに、連日寒くて涙目のトランスビットの中の人です。
冬に底値で買ってきて、今満開を迎えている庭のビオラの花が、ナメクジの食害にあっています。
ゆ る せ な い !
奴らは夜行性で、日中は土の中に潜っているそうです。
そんなわけで、夜な夜な割り箸と酢のはいった容器を持って見つけ次第捕殺しているのですが、見つけるたびに「オオナメクジ が あらわれた! →たたかう」って感じでDQ2の戦闘を思い出します。
ナメクジを捕殺している私の姿が、道行く人々を驚かせていないことを願います。

さて、PHPではdirname()を使うと、ディレクトリ名がとれます。
一階層上のディレクトリ名を取得したい場合、さらにdirname()。もう一階層(ry

$dir = dirname( $_SERVER["REQUEST_URI"] ); // URIの最後のディレクトリ

$dir1 = dirname( $dir ); // 一階層上
$dir2 = dirname( $dir1 ); // 二階層上
$dir3 = dirname( $dir2 ); // 三階層上

地味に便利です。

Filed under: ,