あると便利かもしれない自作関数集


#はじめに
この記事はPHP Advent Calendar 2018の17日目の記事です。
当初ファイルのアップロード関連の記事を書く予定でしたが、時間が取れなかったため、
自分が開発の際に利用している、**頻繁に使わないが、あると便利なヘルパ関数**を共有します。

#リンク自動付加

HTMLテキスト内で、URLにリンクを自動で付加する処理を行います。
日本語リンクには非対応だったり、改行に対応していません。

```php
/** ////////////////////////////////////////////////////////
 * replace_link
 * 文章のリンクを自動で挿入する関数です。
 * @param string $input : 置換する前の文章
 * @param string $output : 置換した後の文章
 * 
 * 備考:日本語リンクには非対応
 *    : リンクの後にURLとして有効な文字列が続いた場合リンクが継続しているとみなして処理する
 *      リンクの中に改行が入っているときはその前までをURLとみなす
 *        ※ 改行文字はURLを構成する文字ではない
 *    : inputのテキストの<a>タグには必ず</a>があること
 *    : HTMLエンコードされていること
 */
function replace_link($input){
	$cntents = "";

	/*
	 以下の正規表現は
	 ・タグで囲まれていない箇所
	 ・タグ(<div>など)や閉じタグ(</div>)を取りだす(aタグは例外)
	 ・<a>～</a>までを取り出す
	 */
	preg_match_all('/([^<]*)((?:<\/??[^a].*?>)|(?:<a.*?>.*?<\/a>))?/si', $input, $out, PREG_PATTERN_ORDER);
	// タグで囲まれていない箇所をループで編集する
	for ($ii = 0; $ii < count($out[0]); $ii++) {
		// タグで囲まれていない箇所のURL文字列を<a></a>で囲む
		$cntents .= preg_replace('/(https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/', "<a href=\"$1\">$1</a>", $out[1][$ii]);
		// 編集した情報とその他を結合する
		$cntents .= $out[2][$ii];
	}

	return $cntents;
}
```


#リダイレクト

リダイレクトをする際にステータスコードを設定したうえでリダイレクトを行う関数。
PHPではステータスコードを付けてリダイレクトを行う際に、2行必要になるので、それをまとめておく。

リダイレクト処理をひとまとめにしておきたい場合に使用しています。

CakePHPやLaravelなど、一般的なフレームワークでは実装されていたりするので、フレームワークを利用しているひとには必要ないかも

```php
/** ////////////////////////////////////////////////////////////////////////
 * @param string
 * @param string
 */
function redirect($url, $header_code = '')
{

	if($header_code == '404') {
		header("HTTP/1.1 404 Not Found");
		header('Location: '.$url);
		exit;
	if($header_code == '410') {
		header("HTTP/1.1 410 Gone");
		header('Location: '.$url);
		exit;
	}else if($header_code == '403') {
		header("HTTP/1.1 403 Forbidden");
		header('Location: '.$url);
		exit;
	}else if($header_code == '301') {
		header("HTTP/1.1 301 Moved Permanently");
		header('Location: '.$url);
		exit;
	}else if($header_code == '302') {
		header("HTTP/1.1 302 Found");
		header('Location: '.$url);
		exit;
	} else {
		header('Location: '.$url);
		exit;
	}
	
}
```

上の関数を利用して、エラーがあった際にエラーページに飛ぶ用の関数を作成した。

```php
/** ////////////////////////////////////////////////////////////////////////
 * @param string
 * @param bool
 */
function error_redirect()
{
	//リンク飛び先は任意
	redirect("/error/", 404);
}
```

#デバッグ関連

デバッグ出力用の関数。

CakePHPのpr()と等価です。

```php
/** ////////////////////////////////////////////////////////////////////////
 * @debug
 */
function printDebug($var, $dump = false)
{
	echo '<div style="text-align:left"><pre>';
	$dump ? var_dump($var) : print_r($var);
	echo '</pre></div>';
}
```

#デバッグ関連２

ajax処理や、リダイレクト前の処理などで、デバッグを行いたい場合、
テキストファイルにデバッグを吐かせる関数です。

開発環境と本番環境のパスを設定して、ファイルを設置し関数を呼び出せば、その処理を通る際にデバッグされます。

```php
/** ////////////////////////////////////////////////////////////////////////
 * @param mixed
 * @param string モード
 * @param string ファイル名
 * $mode w=上書き / a=追加(アペンド)
 * 開発環境と本番環境のパスを設定して、ファイルを設置してください。
 */
function registerDebug($str, $mode = "w" ,$file_name = "hoge.txt")
{
	//開発環境
	if(mb_strpos($_SERVER['HTTP_HOST'], 'localhost')){ //例
		$debug_file = "/var/www/httpdocs".$file_name;
	}
	//本番環境
	 else {
		$debug_file = "/var/www/example.com/".$file_name;
	}

	if(file_exists($debug_file)){

		$h = fopen($debug_file,$mode);

		if(is_array($str)){
			fwrite($h,print_r($str,true));
		}else{
			fwrite($h,$str);
		}

		fclose($h);
	}
}
```

#おわりに
なにか不具合や改善点があればコメントください。