カテゴリーアーカイブ PHP

村上 著者:村上

【PHP】文字列を全角←→半角に変換するmb_convert_kana()関数

覚えておくと意外と便利なので、備忘録としてまとめ。
PHPで全角を半角に、もしくはその逆を行う方法です。

今回使う関数は、mb_convert_kana()です。
参考にさせていただいたページはこちら。

PHP関数 – 半角 ⇔ 全角 変換 – mb_convert_kana() – PHP入門のカルマ
https://webkaru.net/php/function-mb-convert-kana/

 

使い方はこちら。

$result = mb_convert_kana([変換したい文字列], [変換方法]);

上記のように指定します。
なお、変換方法は省略が可能で、省略した場合は、KV(=「半角カタカナ」を「全角カタカナ」にし、濁点付きの文字を一文字に変換)になります。
変換方法の一覧は下記のとおりです。

 

オプション 変換内容
r 「全角」英字を「半角」に変換
R 「半角」英字を「全角」に変換
n 「全角」数字を「半角」に変換
N 「半角」数字を「全角」に変換
a 「全角」英数字を「半角」に変換
A 「半角」英数字を「全角」に変換
s 「全角」スペースを「半角」に変換
S 「半角」スペースを「全角」に変換
k 「全角カタカナ」を「半角カタカナ」に変換
K 「半角カタカナ」を「全角カタカナ」に変換
h 「全角ひらがな」を「半角カタカナ」に変換
H 「半角カタカナ」を「全角ひらがな」に変換
c 「全角カタカナ」を「全角ひらがな」に変換
C 「全角ひらがな」を「全角カタカナ」に変換
V 濁点付きの文字を一文字に変換。K、Hと共に使用

よく使いそうなのは、「as」かな?
このオプションでは、英数字とスペースを半角にします。
なお、オプションは複数指定できます。

 

以上、文字列を全角←→半角に変換する方法でした。
全角が入力されては困る項目などでは、少なくとも「askh」あたりを指定しておけば、ある程度は対応できるかと思います。
是非、ご活用ください。

  • この記事いいね! (0)
takahashi 著者:takahashi

FuelPHP初期設定時に”It is not safe to rely on the system’s timezone settings.”エラーが出た時の対処法

先日、自分用にFuelPHPのテスト環境を作成していた時のこと。
ファイルやウェブサーバー周りの設定が終わって、テストでFuelPHPを動作させたところ…

Fuel\Core\PhpErrorException [ Error ]:
date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.

初めて見るエラー(汗
前回別の環境でセットアップした時はこんなエラーは出たことがなく、原因がわからなかったのでちょっと焦りました。

困っていろいろ調べていたら、こちらのサイトを発見。

[PHP]php.iniのtimezoneを設定する – Qiita

どうやら、PHP自身にデフォルトタイムゾーンを指定しないとダメ見たいです。

今回はCentOS7を使っていたので、php.iniは
/etc/php.ini
にありました。

php.ini内の

[date]セクションの部分に、赤枠のように記入します。

date.timezone = "Asia/Tokyo"

これでphp.iniを保存し、Apacheを再起動。

再度実行してみると

無事スタートページが表示されました。

  • この記事いいね! (0)
村上 著者:村上

【PHP】正規表現をチェックできる「正規表現チェッカーPHP: preg_match() / JavaScript: match()」【JavaScript】

今回は、正規表現を扱うときによく利用するサイトを紹介。
といっても、知ってる人も多いかと思います。

正規表現チェッカー PHP: preg_match() / JavaScript: match()
http://okumocchi.jp/php/re.php

正規表現が正しいかどうかをチェックしてくれるサイトです。
他にもいくつかありますが、私はもっぱらこのサイトを使っています。
検索結果の一番上に来ることが多いので、それも理由の一つですね。

 

サイトはこのようなレイアウトです。

上のテキストボックスにチェックしたい正規表現を入力し、下のテキストエリアにチェックしたい文字列を入力して、チェック!のボタンを押します。
すると、結果が下のエリアに表示されます。
検索結果の配列まで表示されるので、特に重宝しましたね。

また、下にリファレンスが載っているので、それを見ながら正規表現を組み立てることができます。
最近はよく使うものについては覚えられるようになってきましたが…最初のころはチンプンカンプンだったので、これにかなり助けられました…。
郵便番号やメールアドレスをチェックするためのサンプルもいくつか掲載しており、これにも非常に助けられました。

そして、このサイトでは、PHPだけでなく、JavaScriptでの結果も同時に確認できます。
まあ、結果はPHPとほぼ同じですが…。

 

以上、PHPやJavaScriptの正規表現をチェックする方法でした。
正規表現って苦手な方も多そうですし、私もその一人でしたが…覚えるとかなり便利なので、こういったサイトを活用して頑張りましょう

  • この記事いいね! (0)
村上 著者:村上

【PHP】文字列の置換を行うstr_replace()、preg_replace()の違い

今回はPHPで文字列を置換する方法について。
が、文字列の置換でも、関数は2種類あるので、その違いについて。
どちらかというと、自分のためのまとめですね。

置換を扱う関数は、str_replace()preg_replace() があります。
PHPマニュアルは下記からご確認ください。

str_replace():http://php.net/manual/ja/function.str-replace.php
preg_replace():http://php.net/manual/ja/function.preg-replace.php

 

使い方は下記のとおりです。

$text = "ABCDEF";  // 置換前の文字

$result1 = str_replace("A", "Z", $text);
$result2 = preg_replace("/^A/", "Z", $text);

結果はどちらも「ZBCDEF」になります。

例を見てわかる通り、str_replace() は A を B に置き換えるなど、単なる文字列の置換に向いています。
マニュアルにも、「正規表現のような技巧的な置換を必要としない場合、preg_replace() の代わりにこの関数を常用するべき」とありました。
対して、preg_replace() は正規表現を利用する、少し複雑な検索と置換を扱うときに使用します。

なお、今回は書きませんでしたが、どちらの関数でも置換した回数を取得することができます。
str_replace()の時は、第4引数に、preg_replace()の時は、第5引数に、$count などの変数を指定しておくと、指定した変数の中に、置換回数が格納されます。

 

以上、PHPで文字列を置換する方法でした。
単純な置換の場合は str_replace()を、正規表現を使った置換の場合は preg_replace()を使うように心がけましょう。

  • この記事いいね! (0)
村上 著者:村上

【PHP】指定した幅で文字列を丸める関数「mb_strimwidth()」

本日は、他の人が書いたソースコードを読んでいて発見したPHPの関数「mb_strimwidth()」について。
「この関数見たことないな?何だろう?」と調べたところ、指定した幅で文字列を丸めてくれるとのことで…とっても便利そうな関数でした。
もう少し早くに出会いたかった…!

PHPマニュアルの mb_strimwidth()関数についてのページはこちらから。

PHP: mb_strimwidth-Manual
http://php.net/manual/ja/function.mb-strimwidth.php

 

さて、具体的な使い方は、下記のとおりです。

$text = mb_strimwidth("丸めたいテキストを指定", 0, 20, "....", "UTF-8");

上のコードを実行すると、「丸めたいテキスト….」という結果になります。
どうやら第3引数の丸めた後のテキスト幅は、第4引数の文字数を丸めた後に追加する文字列まで含めた数で、かつ半角でカウントした場合のようです。
なお、第5引数の文字コードは指定しておくと、文字化けしなくなるとのことなので、出来る限り指定したほうがよさそうです。
こちらについては、下記のサイトが分かりやすかったです。

指定した文字数で文字列をまるめるPHPの関数 mb_strimwidth で、第4引数に「文字列をまるめた後に付加する文字列を指定」する際、色々気を付けないと文字化けるよ、というお話。|ITキヲスク
http://smkn.xsrv.jp/blog/2013/03/mb_strimwidth-function-tips/

 

以上、mb_strimwidth() で文字列を丸める方法でした。
以前の記事で、JavaScriptで文字列を丸める方法についても紹介しましたが、こちらの方が便利そうですね。
今後はこちらを積極的に使うようにしたいと思います。

  • この記事いいね! (0)
村上 著者:村上

【PHP】画像URLから画像をBase64にエンコードする方法

昨日の記事に引き続き、本日もPHPについて。
今回は、画像URLを Base64 にエンコードする方法です。
…需要があるかは分かりません。

Webページの読み込み時に、画像の表示があまりに遅かったり、そもそも表示できないものがあったので、Base64に変換してしまえば何とかなるのでは?と試してみました。

 

コードはこちらから。

$image_url = [変換したい画像のURL]; 
$entry_image = "";  // Base64に変換後のデータ
if(!empty($image_url) && @file_get_contents($image_url, NULL, NULL, 0, 1)) {
    switch (true) {
        case preg_match('/(\.jpg)$|(\.jpeg)$|(\.JPEG)$|(\.JPG)$/', $image_url):
            $image_type = "image/jpeg";
            break;
        case preg_match('/(\.png)$|(\.PNG)$/', $image_url):
            $image_type = "image/png";
            break;
        case preg_match('/(\.gif)$|(\.GIF)$/', $image_url):
            $image_type = "image/gif";
            break;
        case preg_match('/(\.bmp)$|(\.BMP)$/', $image_url):
            $image_type = "image/bmp";
            break;
        default:
            $image_type = "";
            break;
    }
    if($image_type != ""){
        $img_base64 = base64_encode(file_get_contents($image_url));
        $entry_image = "data:".$image_type.";base64,".$img_base64;
    }
}

3行目で、file_get_contents 関数を使い、画像が実際に存在するかどうかを調べています。
ちなみに、戻り値を全て取得すると時間がかかるので、1文字だけ取得するようにして、高速化を図っています。
そして、Switch文で末尾を確認して、画像の拡張子が何かを判断しています。
22行目では、ファイルデータをBase64にエンコードしています。
エンコードには、PHPの関数の base64_encode を使用しています。
なお、最終的に変換したデータは $entry_image に格納され、もし変換できなかった場合は空文字が格納されます。

 

以上、画像URLから、画像を Base64 にエンコードする方法でした。
これを試したところ、実際画像の表示速度は速くなりましたね。
が、文字数としてはかなり増えたので、若干通信速度が遅くなりました…。
通信速度が画像の表示速度か…どちらを取るかはその時の状況によって対応してください。

  • この記事いいね! (0)
著者:杉浦

マテリアルデザインのさわり

Design – Material Design
マテリアル・デザインって何? Androidデザイン責任者にインタヴュー | ギズモード・ジャパン
 マテリアルデザインの思想が理想とするデザインは脳にスッと入ってくるデザインです。
マテリアルデザインは一貫性のある法則を持つ世界の上でデザインを行うことで、脳にスッと入ってくるデザインを実現しようとします。一貫性のある法則には実世界の一部を再現するような法則が用いられています。ここで一部、とあるのはマテリアルデザインの目的がユーザの理解の促進にあるからです。理解を妨げて、処理を重くするだけの余分な法則を再現する理由はありません。主な法則は、実世界において紙を重ねた時に起きる現象を再現する直感的な法則です。例えば、ページはhogehogeとかかれたカードの集まり(並べてもいいし、重ねてもいい)で構成される。これは実世界の紙を重ねた時の状態を再現する法則です。他には、カード内から画像や文字ははみ出さない、下の要素には上の要素の影が落ちる。これはそれぞれ、紙面からはみ出して宙に浮く画像や文字はない、下の物体には上のカードの影が落ちる、という実世界上の法則の再現です。
 マテリアルデザインの効果の一例が次です。
ヘッダに影がない

ヘッダに影がある

 影がついた場合ヘッダが下の記事欄から独立していることがわかるため、スクロールをしてもヘッダが固定されると連想しやすくなります。

  • この記事いいね! (1)
村上 著者:村上

【PHP】Switch文の条件に正規表現を使う方法

今回は、Switch文の応用的な使い方についてです。
コード内で、Aの正規表現の条件に一致したら Aの処理、Bの正規表現の条件に一致したら Bの処理…というようなSwitch文を書きたかったので、今回の方法を試してみました。

参考にさせていただいた記事はこちら。

PHP switch文の応用的な使い方 – Qiita
https://qiita.com/tkykmw/items/ee0ab7bf502361f413d8

 

で、早速書き方はこちらから。

$image_url = [画像のURL];
switch (true) {
    case preg_match('/(\.jpg)$|(\.jpeg)$|(\.JPEG)$|(\.JPG)$/', $image_url):
        // jpeg画像の時の処理
        break;
    case preg_match('/(\.png)$|(\.PNG)$/', $image_url):
        // png画像の時の処理
        break;
    case preg_match('/(\.gif)$|(\.GIF)$/', $image_url):
        // gif画像の時の処理
        break;
    case preg_match('/(\.bmp)$|(\.BMP)$/', $image_url):
        // bmp画像の時の処理
        break;
}

今回のコードは、画像URLの末尾の拡張子を調べて、その拡張子ごとに処理を分けています。

ちなみに、この書き方は JavaScriptでも使えます。
なお、その場合は、case の後の条件で test() メソッドを使います。
正規表現自体はPHPとほぼ同じです。

 

以上、switch文の条件に正規表現を使用する方法でした。
switch文の引数に true を指定するやり方を知らなかったので、こんな書き方があるのかと少し驚きでした。
とても興味深かったです。
これで少し複雑な条件分岐が大分楽になりそうです。
同じことにお困りの方がいらっしゃいましたら、是非参考にしていただければと思います。

  • この記事いいね! (1)
村上 著者:村上

【PHP】PDOでMySQLを使った際のエラー「Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: no parameters were bound’」

今回は、PDOを使ってMySQLでデータを取り出すときに遭遇したエラーについて。
コード自体は、既に動いているものをコピーして修正したものなので、動かなくて焦りました…。

エラー全文はこちら。

Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: no parameters were bound’ in [エラーが発生したファイル名]

 

で、調べたところ、SQL文の構文エラーがある場合や、パラメータの数が一致していない時に発生するエラーとのことです。
なお、今回参考にした記事はこちら。

PHP-PDOを使ったSQL文のエラー(HY093)|teratail
https://teratail.com/questions/3209

私の場合は、パラメータの数が一致していなかったために発生していました。
また、下記のサイトによると、「クエリのプレイスホルダとバインドするパラメータはきちんと数を合わせる必要がある」とのことでしたので、こちらが原因ですね。

PDO::bindParamの挙動を知る|Kwappa研究開発室
http://randd.kwappa.net/2008/05/29/25

恐らくコピーした時に、何かが抜けるかしたのかと思われます。

 

ということで、PDOを使用した時に発生したエラーの対処法でした。
今回のエラーについては、とりあえずコードを良く読み返して、パラメータに数を確認することが解決への近道ですね。
エラーに遭遇した時はとにかく焦ってしまうものですが、あわてず騒がず落ち着いて、最初から確認し直すことを心掛けたいです。

  • この記事いいね! (0)
著者:杉浦

phpにおけるsort

phpのsort関数の説明です。
 phpの説明書:原文和訳
 phpに備え付けのソート関数はここにある以下の表の通りです。

ソート関数の特性
関数名 ソートの基準 キーと値の相関関係 ソート順 関連する関数
array_multisort() 連想配列の場合は維持し、数値添字配列の場合は維持しない 最初の配列、あるいはソートオプション array_walk()
asort() 維持する 昇順 arsort()
arsort() 維持する 降順 asort()
krsort() キー 維持する 降順 ksort()
ksort() キー 維持する 昇順 asort()
natcasesort() 維持する 大文字小文字を区別しない自然順 natsort()
natsort() 維持する 自然順 natcasesort()
rsort() 維持しない 降順 sort()
shuffle() 維持しない ランダム array_rand()
sort() 維持しない 昇順 rsort()
uasort() 維持する ユーザー定義 uksort()
uksort() キー 維持する ユーザー定義 uasort()
usort() 維持しない ユーザー定義 uasort()

 キーと値の相関関係はキーAなら値a、キーBならbといった関係のことです。マップ的に使っていて配列のキー名に意味があるなら相関関係を維持するべきで、配列のキー名が順番を表すただの数字の様なものなら維持は不要になるでしょう。
 自然順は1A,10A,100Aと並ぶことです。不自然な辞書順は’0’は’A’より小さいからと100A,10A,1Aと並べることです。詳しくはNatural Order String Comparisonを参照するとよいです。
 配列中配列などの複雑なソートをしたいときはユーザ定義ソートを使用することで解決でき安栖。任意の比較関数$value_compare_funcを定義してusort ( array &$array , callable $value_compare_func )と記述します。比較関数の定義にはstrcmp()の様な備え付けの比較関数を利用すると楽です。
 phpのソートはC言語の関数であるsort()を拡張したものです。phpのソースコード中のext/standard/array.cに上記の関数の中身が色々書いてあります。さらにarray.c中のzend_hash_sort()、Zend/zend_hash.h中のzend_hash_sort()内のzend_hash_sort_ex()、zend_hash.c中のzend_hash_sort_ex()と追っていくことができます。

  • この記事いいね! (0)