6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPAdvent Calendar 2018

Day 17

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

Posted at

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

#リンク自動付加

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

/** ////////////////////////////////////////////////////////
 * 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など、一般的なフレームワークでは実装されていたりするので、フレームワークを利用しているひとには必要ないかも

/** ////////////////////////////////////////////////////////////////////////
 * @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;
	}
	
}

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

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

#デバッグ関連

デバッグ出力用の関数。

CakePHPのpr()と等価です。

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

#デバッグ関連2

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

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

/** ////////////////////////////////////////////////////////////////////////
 * @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);
	}
}

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

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?