カテゴリーアーカイブ PHP

村上 著者:村上

【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)
村上 著者:村上

【PHP】配列で重複した値を削除する方法

たまにしか使わないから毎回忘れる配列の値が重複したときの削除方法について。
今回使用するのは、array_unique という関数です。
PHPのマニュアルページはこちらから。

PHP: array_unique – Manual
http://php.net/manual/ja/function.array-unique.php

 

こちらの関数は、重複を削除したい配列を引数として渡せば、重複を削除した後の配列を戻り値として返してくれます。
サンプルコードは下記のとおりです。

$array = array(1, 3, 5, 1, 2, 4, 3);
// 重複削除
$unique = array_unique($array);

// 実行結果:array(1, 3, 5, 2, 4)

ただし、この関数では、重複削除後もキーは保持されます。
なので、詳細に書くと結果が下記のようになっていることに注意してください。

$array = array(0 => 1,
               1 => 3,
               2 => 5,
               3 => 1,
               4 => 2,
               5 => 4,
               6 => 3);
// 重複削除
$unique = array_unique($array);

// 実行結果:array(0 => 1,
//                1 => 3,
//                2 => 5,
//                4 => 2,
//                5 => 4);

結果を単に foreach かなにかで処理するだけなら問題ないかと思いますが、キーをセットに扱う処理を行う場合などは、このままでは使えません。
その場合は、PHPの関数の array_values を使います。
こちらを使うと、数字が飛び飛びになったキーの番号を振り直すことができます。
使用方法はこちら。

$array = array(0 => 1,
               1 => 3,
               2 => 5,
               3 => 1,
               4 => 2,
               5 => 4,
               6 => 3);
// 重複削除
$unique = array_unique($array);
// キーの振り直し
$result = array_values($unique);

// 実行結果:array(0 => 1,
//                1 => 3,
//                2 => 5,
//                3 => 2,
//                4 => 4);

これでキーの番号が飛び飛びになる問題も解決できます。

 

ということで、配列のデータ重複を解消する方法でした。
意外と使う機会がある関数なので、覚えておいて損はないはず。
ついでに、下の方で紹介した配列のキーの振り直し方法についてもセットで覚えておくといいでしょう。

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

Zend Framework1 Zend_Mail+PHP5.6ではSSLのチェックが無効化できない

既にサポートの終わったZendFramework1ですが、今使っている方は注意が必要かもしれません。

ZendServer8.5 for IBM i(PHP5.6)を入れて・・・ – ushidayの日記

PHP5.6から、CA証明書のチェックがデフォルトで必須の設定になったようなのですが、
これによって何も指定を行っていない場合、PHPからSMTPS経由でメールを送る場合は接続先SMTPサーバーのSSL証明書が”正しい”物でないと接続に失敗します。

なお、この設定は変更することが可能ではあるのですが、

SSL コンテキストオプション – php.net
調べた限りでは、使用するメールライブラリがSSL コンテキストオプションの”verify_peer”の指定に対応していないと設定変更が難しいようなのです。
Zend Framework1のZend_Mailではこのオプションの指定をサポートしていないため、PHP5.6上で動作させると、強制的にSSL証明書のチェックが有効となります。

ちなみに、Zend Framework1のZend_MailのSSLコンテキスト対応化は行われないことはZend Framework1のGitHubフォーラムで明言されています。

Zend_Mail SMTP SSL Problem with PHP 5.6 – GitHub

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