■目次
PHP Standards Recommendations正規表現を扱うソートコマンド実行GET・POST以外のリクエストを扱うfile_get_contentsでCookieを扱うenum外字や機種依存文字の判定その他
■PHP Standards Recommendations
PHP PSR一覧 2017年版 - Qiita https://qiita.com/rana_kualu/items/f41d8f657df7709bda0f
■正規表現を扱う
■正規表現
if (preg_match('/^[\w\-\/]+$/', $line)) { 〜処理〜 }
■後方参照
if (preg_match('/^\[(.+)\]$/', $line, $matches)) { $data = $matches[1]; 〜処理〜 }
■ソート
2次元配列をソート http://refirio.org/memos/php/multisort/ 2次元配列の2次元目の配列の値でソートをする - Qiita https://qiita.com/tadasuke/items/e7be0d214e02105ab6d8 PHP で二次元配列を特定の値でソートする - Qiita https://qiita.com/shimon_haga/items/c7fcfe58521e79dfc361
■コマンド実行
PHPはコマンド実行関数多すぎだろ - ぱせらんメモ http://d.hatena.ne.jp/pasela/20081217/exec
■GET・POST以外のリクエストを扱う
HTTPメソッド(CRUD)についてまとめた - Qiita https://qiita.com/Ryutaro/items/a9e8d18467fe3e04068e PHP(GET、POST、PUT、またはDELETE)で要求タイプを検出する [request] | CODE Q&A 問題解決 [日本語] https://code.i-harness.com/ja/q/57a87 PHP の file_get_contents は get どころか post も put も delete も upload もできる - tototoshi の日記 http://tototoshi.hatenablog.com/entry/2014/06/10/011223 LaravelにフォームからPUT/DELETEリクエストを送る - Qiita https://qiita.com/ozhaan/items/c1e394226c1d5acb7f0e ■リクエストする側
<?php // 単純なGET echo file_get_contents('http://localhost/~test/request/target.php'); echo '<hr>'; // GET echo file_get_contents( 'http://localhost/~test/request/target.php?test=GETのテスト', false, stream_context_create( array( 'http' => array( 'method' => 'GET', 'header' => 'Content-Type: text/html', ) ) ) ); echo '<hr>'; // POST echo file_get_contents( 'http://localhost/~test/request/target.php', false, stream_context_create( array( 'http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => http_build_query( array( 'test' => 'POSTのテスト', ) ) ) ) ) ); echo '<hr>'; // PUT echo file_get_contents( 'http://localhost/~test/request/target.php', false, stream_context_create( array( 'http' => array( 'method' => 'PUT', 'header' => 'Content-Type: text/html', 'content' => http_build_query( array( 'test' => 'PUTのテスト', ) ) ) ) ) ); echo '<hr>'; // DELETE echo file_get_contents( 'http://localhost/~test/request/target.php', false, stream_context_create( array( 'http' => array( 'method' => 'DELETE', 'header' => 'Content-Type: text/html', ) ) ) ); echo '<hr>';
■リクエストされる側
<?php switch ($_SERVER['REQUEST_METHOD']) { case 'GET': echo 'GET:'; break; case 'POST': echo 'POST:'; break; case 'PUT': echo 'PUT:'; break; case 'DELETE': echo 'DELETE:'; break; case 'HEAD': echo 'HEAD:'; break; case 'OPTIONS': echo 'OPTIONS:'; break; case 'TRACE': echo 'TRACE:'; break; case 'CONNECT': echo 'CONNECT:'; break; default: echo 'NG'; break; } print_r($_REQUEST); parse_str(file_get_contents('php://input'), $parameter); print_r($parameter);
■file_get_contentsでCookieを扱う
【PHP】コマンドラインでサイトへのログイン処理を実装する方法 - とりあえずphpとか http://kimagureneet.hatenablog.com/entry/2015/09/17/014853 CookieのIDを取得
<?php echo file_get_contents('http://localhost/test/session.php'); print('<pre>'); print_r($http_response_header); print('</pre>'); $cookies = array(); foreach ($http_response_header as $header) { $data = explode(':', $header); if ($data[0] == 'Set-Cookie') { $cookies[] = $data[1]; } } print('<pre>'); print_r($cookies); print('</pre>'); $session_id = ''; foreach ($cookies as $cookie) { if (preg_match('/laravel_session=(.+); /', $cookie, $matches)) { $session_id = $matches[1]; } } echo 'session_id=' . $session_id;
取得したCookieのIDとともにリクエスト
<?php $session_id = 'eyJpdiI6ImNIV05pQjZNdVpYODc4MUwra05kMWc9PSIsInZhbHVlIjoia0ttVXF6VjRDK2FrbEJzUGhSXC9ac2FIZGFmS2N6YUlKaG45TndCKzFwNFVOODBVWjlwTTI3TVhHeDFreDRucTYiLCJtYWMiOiI4OTk4ZTQ1NzI0YWM3NjY2MTNjZDViZjFhMTBmMWQwZTViZGQzOTFjN2M3MGRmZDg5Nzg4ZTdlZGVmNDAyZDg4In0%3D'; //$session_id = 'eyJpdiI6Im1iT3ZSV1l5c2NPMExteUhDQmhhS2c9PSIsInZhbHVlIjoiZHE2QTluMWFBQlZWNlh2ZGtLM1Vmb0ZLaU9yN0Y4aXF2NzVROXYwNlwvR2FQMWVRUHpvb2M0d0ZyQVZRNkxMYWMiLCJtYWMiOiI5OTk2MDY0MTUwMjNiMDU3YTczNWIyMzJhNzRmMDRmN2EyOGQyMmQzMmMwOTNmYTdmNzdjYzIzNjJjNWFkMDNhIn0%3D'; //$session_id = 'eyJpdiI6Ikl2aCtidEdSYXZYYmJRbmlXUnFkZEE9PSIsInZhbHVlIjoic0VUNjJOM2tTVStVejlkb2l1VHJGb3J0aVg3WEpaZU9YeVRUcjVUUEpXSVJcL3lzOHZcL21ObWtrQkZucks3dXJEIiwibWFjIjoiODNjNWRhOTlkNzVmOWEyNzNiN2NkMWUyYjVlM2Q0NDdhNTAyNDQ4ODA5NjZjMjQyNjNkN2E2Njg3Mjc0NWYyMCJ9'; $result = file_get_contents( 'http://localhost/test/session.php', false, stream_context_create( array( 'http' => array( 'method' => 'GET', 'header' => "Cookie: laravel_session=" . $session_id . ";\r\n" ) ) ) ); echo $result;
■強制ログインの例
<?php /* * 認証情報をリクエスト */ file_get_contents( 'http://localhost/~test/auth/enter.php', false, stream_context_create( array( 'http' => array( 'method' => 'POST', 'header' => "Content-Type: application/x-www-form-urlencoded;\r\n", 'content' => http_build_query( array( 'username' => 'developer', 'password' => 'abcd1234', ) ) ), ) ) ); /* * 認証後、CookieからセッションIDを取得 */ $cookies = array(); foreach ($http_response_header as $header) { $data = explode(':', $header); if ($data[0] == 'Set-Cookie') { $cookies[] = $data[1]; } } $session_id = ''; foreach ($cookies as $cookie) { if (preg_match('/laravel_session=(.+); /', $cookie, $matches)) { $session_id = $matches[1]; } } /* * ログイン後ページを表示 */ echo file_get_contents( 'http://localhost/~test/auth/home.php', false, stream_context_create( array( 'http' => array( 'method' => 'GET', 'header' => "Cookie: laravel_session=" . $session_id . ";\r\n", ) ) ) ); exit('Complete');
■その他メモ 【Swift】ユーザー認証APIを通した後、同一セッションとしてUIWebViewを表示する - Qiita https://qiita.com/ktanaka117/items/e4921f061f6522ed5a63
■enum
【Swift入門】enumの使い方をわかりやすくまとめてみた | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト https://www.sejuku.net/blog/35711 Swiftなどではenum(列挙型)を使える これをPHPでも使う方法 Enumを使ってフラグ値を良い感じに扱う - Qiita https://qiita.com/akihiro-iwata/items/b580b225eba48d780e68 PHPで列挙型(enum)を作る - Qiita https://qiita.com/Hiraku/items/71e385b56dcaa37629fe 以下、enumを使った具体的なコード
<?php /* * 列挙型(enum)を作る */ abstract class Enum { private $scalar; public function __construct($value) { $ref = new ReflectionObject($this); $consts = $ref->getConstants(); if (!in_array($value, $consts, true)) { throw new InvalidArgumentException; } $this->scalar = $value; } final public static function __callStatic($label, $args) { $class = get_called_class(); $const = constant($class . '::' . $label); return new $class($const); } final public function valueOf() { return $this->scalar; } final public function __toString() { return (string)$this->scalar; } } // トランプのスート型を定義する。4種類しか値を取らない final class Suit extends Enum { const Spade = 1; const Heart = 2; const Club = 3; const Diamond = 4; } // インスタンス化 $suit = new Suit(Suit::Spade); echo $suit; // spade echo '<hr>'; echo $suit->valueOf(); // spade echo '<hr>'; $suit = new Suit(Suit::Heart); echo $suit; echo '<hr>'; // __callStaticを定義してあるのでnewを使わずこのように書くことができる(PHP5.3以降) $suit = Suit::Spade; if ($suit == Suit::Spade) { echo 'スペードです。'; } else { echo 'スペードではありません。'; } // 存在しない値を指定するとエラー //new Suit('uso800'); // InvalidArgumentException //new Suit(Suit::TEST); // InvalidArgumentException //Suit::TEST; // InvalidArgumentException
■外字や機種依存文字の判定
/** * JISの半角および、第1、2水準文字であることのチェック。 * @param $data 検査する文字列 * @return true:OK、false:NG * @see 外字や機種依存文字を弾く。第4水準文字は通るが、UTF-8で扱うと問題なくDBでも格納できるのでスルーとしている */ function validator_jis_1or2($data) { $rtn = ''; for ($idx = 0; $idx < mb_strlen($data, 'utf-8'); $idx++) { $str0 = mb_substr($data, $idx, 1, 'utf-8'); // 1文字をSJISにする。 $str = mb_convert_encoding($str0, 'sjis-win', 'utf-8'); //if (strlen($str) == 1) { // 1バイト文字 if ((strlen(bin2hex($str)) / 2) == 1) { // 1バイト文字 $c = ord($str{0}); } else { $c = ord($str{0}); // 先頭1バイト $c2 = ord($str{1}); // 2バイト目 $c3 = $c * 0x100 + $c2; // 2バイト分の数値にする。 if ((($c3 >= 0x8140) && ($c3 <= 0x853D)) || // 2バイト文字 (($c3 >= 0x889F) && ($c3 <= 0x988F)) || // 第一水準 (($c3 >= 0x9890) && ($c3 <= 0x9FFF)) || // 第二水準 (($c3 >= 0xE040) && ($c3 <= 0xEAFF))) { // 第二水準 } else { $rtn .= $str0; } } } if ($rtn != '') { return false; } else { return true; } } /** * 機種依存文字であることのチェック。 * @param $data 検査する文字列 * @return true:OK、false:NG * @see 特定機種依存文字を弾く。(?などの)旧漢字は通る。第一第二水準などの範囲で絞らない場合に使用。 */ function validator_machine_department($data) { $pdc = '??????????????????????????????????????????????????????????????????????????????????¬???'; $pdc_array = Array(); $pdc_text = str_replace(array("\r\n","\n","\r"), '', $data); while ($iLen = mb_strlen($pdc, 'UTF-8')) { array_push($pdc_array, mb_substr($pdc, 0, 1, 'UTF-8')); $pdc = mb_substr($pdc, 1, $iLen, 'UTF-8'); } foreach($pdc_array as $value) { if (preg_match('/(' . $value . ')/', $pdc_text)) { return false; break; } } return true; }
■その他
PHPメモ | refirio.org http://refirio.org/page/memo/php PHP「関数っぽいもの」列伝 - Qiita https://qiita.com/tadsan/items/0d1e79b4baff509e7df1