PHP

【PHP】ヒアドキュメントの使い方。

ちょっとはまったのでメモ。

ヒアドキュメントとは複数行に渡る文字列を作成するための記述方法。

下記のように記述する。

$var = '変数は展開される。';
		
$str = <<< TEXT
「&lt;&lt;&lt; TEXT」から「TEXT;」の間に記述された文字列は、
全てが静的な文字列と解釈される。
なお、ヒアドキュメント内での$var
		
また「TEXT」は任意の文字列を設定することができる。
ヒアドキュメント終端のキーとセットになっていればOK。
TEXT;
		
var_dump($str);

↓

string(358) "「<<< TEXT」から「TEXT;」の間に記述された文字列は、 全てが静的な文字列と解釈される。 なお、ヒアドキュメント内での変数は展開される。 また「TEXT」は任意の文字列を設定することができる。 ヒアドキュメント終端のキーとセットになっていればOK。"

といった感じで使用する。

しかしここで一つ注意点として終端を表すキーを記述する場合、その行にはキー文字列及びコロン以外の文字は存在してはならない。
例えばキー文字列の前にインデント(タブやスペース)が存在していると、PHPはヒアドキュメントの終端を正しくパースできず、シンタックスエラーになってしまうので注意されたし。

 

【PHP】file_get_contentsで4系5系のエラーを無視して結果を取得する方法。

見に行ったページが403エラーなどを返してきた時も処理が止まらないようにしたい場合。

$url = 'http://example.com/';

$context = stream_context_create(array(
	'http' => array('ignore_errors' => true)
));
$html = file_get_contents($url, false, $context);

file_get_contents()の第3引数に上記のような設定を渡してやれば良い。
これで4系、5系のエラーを無視してページの取得結果を返却してくれるようになる。

 

【PHP】コマンドラインの引数をエスケープする。

例をメモ。

$arg1 = escapeshellarg($argv[1]);
$arg2 = escapeshellarg($argv[2]);

$cmd = "php /path/to/file.php $arg1 $arg2 > /dev/null & echo $!";

exec($cmd, $out);

escapeshellarg()関数を使用することで、引数をシングルクオートで囲い、既存のシングルクオートを全てエスケープしてくれる。

 

【PHP】array_walk_recursiveを使うときの引数メモ。

超絶自分用。

$array = array(1,2,3,4,5);

array_walk_recursive($array, function(&$item, $key) {
	return $item *= $item;
});

var_dump($array);

↓

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(9)
  [3]=>
  int(16)
  [4]=>
  int(25)
}

 

【PHP】画像の大きさを取得する。

めも。

// 画像のパスを指定
$image = '/path/to/image.png';

// 画像の大きさを取得する
$size = getimagesize($image);

var_dump($size);

↓

// ダンプ結果の例
array(6) {
  [0]=>
  int(20)
  [1]=>
  int(20)
  [2]=>
  int(3)
  [3]=>
  string(22) "width="20" height="20""
  ["bits"]=>
  int(8)
  ["mime"]=>
  string(9) "image/png"
}

 

【PHP】処理中にbasic認証を要求する。

めも。

$username = 'root';
$password = 'admin';

if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ) {
	header('WWW-Authenticate: Basic realm="Private Page"');
	header('HTTP/1.0 401 Unauthorized');
	die('認証失敗');
}else{
	if($_SERVER['PHP_AUTH_USER'] != $username || $_SERVER['PHP_AUTH_PW'] != $password) {
		header('WWW-Authenticate: Basic realm="Private Page"');
		header('HTTP/1.0 401 Unauthorized');
		die('認証失敗');
	}
}

// 認証を通過するとここに来る

.htaccessで制御するよりお手軽で簡単かも。

 

【PHP】正規表現で否定の条件を指定する。

めも。

否定先読み表現を用いる。

例えば下記のような感じ。

$str = 'aaabbbcccddd';

$pt = '/^(?!.*abbbc).*$/';

$res = preg_match($pt, $str);

var_dump($res);

↓

int(0)

上記は$strの中に「abbbc」という文字が含まれていない場合に1を返す。今回は「abbbc」が含まれているため0が返される。
パターンを下記の様にした場合は当然1が返却される。

$str = 'aaabbbcccddd';

$pt = '/^(?!.*abbc).*$/';

$res = preg_match($pt, $str);

var_dump($res);

↓

int(1)

否定の条件が作れただけで正規表現の幅がぐっと広がった。

一方、肯定先読みというものもあり例は下記の通り。

$str = 'aaabbbcccddd';

$pt = '/^(?=.*abbbc).*$/';

$res = preg_match($pt, $str);

var_dump($res);

↓

int(1)

この場合、指定した文字列「abbbc」がターゲットの中に存在している場合、1を返すようになる。

【PHP】日付文字列をパースして情報を取得する。

めも。

date_parse()関数を用いる。

$date = '2013-12-09 10:10:10.002345';

$info = date_parse($date);

var_dump($info);

↓

array(12) {
  ["year"]=>
  int(2013)
  ["month"]=>
  int(12)
  ["day"]=>
  int(9)
  ["hour"]=>
  int(10)
  ["minute"]=>
  int(10)
  ["second"]=>
  int(10)
  ["fraction"]=>
  float(0.002345)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(false)
}

strtotime()関数に渡せるフォーマットであれば解析してくれる。