【PHP】正規表現で文字列を置換する関数preg_replace()

PHPで、正規表現で条件を指定して文字列の置換をしたい場合、
PHPには、preg_replace()という関数が準備されています。

preg_replace(引数1, 引数2, 引数3, 引数4(省略可))
  • 引数1…検索するパターン。正規表現で指定する。
  • 引数2…置換後のテキストを指定する。
  • 引数3…置換前の元テキスト
  • 引数4…置換を行う最大回数(省略可)

preg_replace()で文字列を置換してみる

まずは、試しにpreg_replace()を使って文字列を置換してみる。

文字列「進撃の巨乳」を「進撃の巨人」に修正したい為、
「巨乳」→「巨人」に置換してみる。

// 変数代入
$string = '進撃の巨乳';
$pattern = '/巨乳/';
$replacement = '巨人';

// ①置換前
echo $string;

// ②置換後
echo preg_replace($pattern, $replacement, $string);
  • ①置換前:進撃の巨乳
  • ②置換後:進撃の巨人

preg_replace()は指定文字列すべてが対象

引数4で置換を行う回数を指定しない限りは、
全ての指定文字列が置換の対象となります。

$string = '巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。';
$pattern = '/巨乳/';
$replacement = '巨人';

// ①置換前
echo $string;

// ②置換後
echo preg_replace($pattern, $replacement, $string);
  • ①置換前:巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。
  • ②置換後:巨人好きな俺の彼女も、巨人な彼女の巨人の友達も「進撃の巨人」が好き。

preg_replace() 正規表現で置換文字列の条件を指定

preg_replace()は指定文字列すべてが対象となってしまう為、
特定の文字列のみ置換の対象としたい場合は、正規表現で条件を指定します。

例えば、”巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。”
という文字列のうち、行の最初の「巨乳」のみを「巨人」に変更したい場合の例。

“行の最初に一致する文字列”という条件指定’^'を使います。

例えば今回の文字列の”行の最初に一致する文字列”を指定したい場合は、
‘/^巨乳/’と記述します。

$string = '巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。';
$pattern = '/^巨乳/';
$replacement = '巨人';

// ①置換前
echo $string;

// ②置換後
echo preg_replace($pattern, $replacement, $string);
  • ①置換前:巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。
  • ②置換後:巨人好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。

preg_replace()は正規表現で(○○~始まる)置換文字列を指定

たくさんの文字列”巨乳”がある中から、
“進撃の巨乳”のみ”進撃の巨人”に置換したい場合の例。

単純に”進撃の巨乳”→”進撃の巨人”に置換してもよいのですが、それでは面白くないので、
preg_replace()で準備されている特殊機能を使ってみます。

preg_replace()の引数2では$n形式で()内の文字列をサブパターンとして持つ事ができます。
1つ目の()は$1、2つ目の()は$2といった感じです。

$string = '巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。進撃の巨乳も巨乳もだぁいすき!';
$pattern = '/(進撃の)巨乳/';
$replacement = '$1巨人';

// ①置換前
echo $string;

// ②置換後
echo preg_replace($pattern, $replacement, $string);
  • ①置換前:巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。進撃の巨乳も巨乳もだぁいすき!
  • ②置換後:巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨人」が好き。進撃の巨人も巨乳もだぁいすき!

【PHP】文字列をスペースで分割し配列に入れる関数

文字列の全角スペースを半角スペースに変換して、その半角スペースごとに文字列を分割して単語ごとに配列に入れる処理を考えてみたのでメモ。

全角スペースと半角スペースが含まれる場合があるので、一旦全角スペースを半角スペースに変換して、スペースを半角スペースに統一し、半角スペースを基準として文字列を分割して配列に入れます

全角スペースを半角に変換して、スペースで分割し配列に入れる関数

▼オブジェクト型クラス編

class ClassXXX{
	private $convert_txt;
	private $arr_txt;
	
	public function spaceSeparate($txt){
		$this->convert_txt = mb_convert_kana($txt, 's', 'UTF-8');

		$this->arr_txt = preg_split('/[\s]+/', $this->convert_txt, -1, PREG_SPLIT_NO_EMPTY);
		return $this->arr_txt;
	}
}

▼手続き型関数編

function spaceConvert($txt){
	$txt = mb_convert_kana($txt, 's', 'UTF-8');

	$arr_txt = preg_split('/[\s]+/', $txt, -1, PREG_SPLIT_NO_EMPTY);
	return $arr_txt;
}

サーバーによっては”mb_convert_kana”が文字化けする事があるので、引数で文字コードを指定すると良いです。

【PHP】ユーザーエージェント(User Agent)からデバイスやキャリアを判別するクラス

スマホ・タブレット・携帯(ガラケー)・PCなどデバイスごとに振り分ける処理をしたいので、各デバイス情報を取得したい。

前回作った、ユーザーエージェント(User Agent)を取得してデバイスを判別するクラスを改造して、携帯(ガラケー)情報とキャリア情報も取得できるようにした。

ユーザーエージェント判定クラス(改)

class UserAgent{
	
	private $ua;
	private $device;
	private $career;
 
	public function UserAgent(){
		$this->deviceCheck();
	}
	
	public function careerCheck(){
	
		//ユーザーエージェント取得
		$this->ua = $_SERVER['HTTP_USER_AGENT'];
 
		if(strpos($this->ua,'DoCoMo') !== false){
			//DoCoMo
			$this->career = 'docomo';
		}
		elseif(strpos($this->ua,'UP.Browser') !== false){
			//au
			$this->career = 'au';
		}
		elseif((strpos($this->ua,'SoftBank') !== false) || (strpos($this->ua, 'Vodafone') !== false) || (strpos($this->ua,'J-PHONE') !== false) || (strpos($this->ua,'SMOT') !== false)){
			//SoftBank
			$this->career = 'softbank';
		}
		elseif(strpos($this->ua,'WILLCOM') !== false){
			//WILLCOM
			$this->career = 'willcom';
		}
		elseif(strpos($this->ua,'emobile') !== false){
			//eモバイル
			$this->career = 'emobile';
		}
		else{
			//不明
			$this->career = 'unknown';
		}
	}
	 
	public function deviceCheck(){
		 
		//ユーザーエージェント取得
		$this->ua = $_SERVER['HTTP_USER_AGENT'];
		$this->careerCheck();
 
		if(strpos($this->ua,'iPhone') !== false){
			//iPhone
			$this->device = 'sp';
		}
		elseif(strpos($this->ua,'iPad') !== false){
			//iPad
			$this->device = 'tb';
		}
		elseif((strpos($this->ua,'Android') !== false) && (strpos($this->ua, 'Mobile') !== false)){
			//Android
			$this->device = 'sp';
		}
		elseif(strpos($this->ua,'Android') !== false){
			//Android
			$this->device = 'tb';
		}
		elseif($this->career != 'unknown'){
			//携帯
			$this->device = 'mb';
		}
		else{
			//PC
			$this->device = 'pc';
		}
	}
	
	public function getDevice(){
		return $this->device;
	}
	
	public function getCareer(){
		$this->careerCheck();
		return $this->career;
	}
}

実行

$ua = new UserAgent();

// スマホ:sp タブレット:tb 携帯:mb PC:pc
echo $ua->getDevice();

getCareer()でキャリア情報も取得できるようにしました。

【PHP】本日の日付を基準に、5,10日を締切とした画像を動的に出力

本日の日付を基準に、5,10日を締切とした画像を動的に出力したい。

1~5日→5日、6~10日→10日、25~31日→末日の画像が出力される処理を考えてみた。

日付画像出力クラス

class ImgPass{	

	private $month;
	private $day;
	private $arr_pass;
	private $arr_num;
	private $deadline;
	 
	public function ImgPass(){
		$day_max = 5;
		// 月日取得
		$this->month = date('n');
		$this->day = floor(((date('j')-1)/5));
		if($this->day > $day_max){
			$this->day = $day_max;
		}
	
		// 画像パス・画像番号配列
		$this->arr_pass = array('m' => 'm', 'd' => 'd');
		$this->arr_num = array('m' => $this->month, 'd' => $this->day);
	
		$this->datePass($this->arr_pass, $this->arr_num);
	}
 
	public function datePass($p, $n){
		$arr_keys = array_keys($p);
		
		foreach($arr_keys as $key){
			$this->deadline[$key] = $p[$key].$n[$key].'.png';
		}
	}
 
	public function getPass(){
		return $this->deadline;
	}
}

実行例

$psss = new ImgPass();
print_r($psss->getPass());

‘m1.png’~’m12.png’と’d0.png’~’d5.png’の画像を準備すれば完成!!

【手続型】

// 月日取得
$month = date('n');
$day = floor(((date('j')-1)/5));
$day_max = 5;
if($this->day > $day_max){
	$this->day = $day_max;
}

// 画像パス・画像番号配列
$arr_pass = array('m' => 'm', 'd' => 'd');
$arr_num = array('m' => $month, 'd' => $day);

$deadline = passPut($arr_pass, $arr_num);

print_r($deadline);

function passPut($p, $n){
	$arr_keys = array_keys($p);
	
	foreach($arr_keys as $key){
		$deadline[$key] = $p[$key].$n[$key].'.png';
	}
	return $deadline;
}

手続型のコードも書いてみたのでサービス!

【PHP】ユーザーエージェント(User Agent)を取得してデバイスを判別するクラス

PC、iPhone、iPad、Android(スマートフォン)、Android(タブレット)などデバイスごとに振り分ける処理をしたい。

ユーザーエージェント(User Agent)を取得して、デバイスを判別するクラスを作ってみた。

ユーザーエージェント判定クラス

class UserAgent{

	private $ua;
	private $device;

    public function UserAgent(){
        $this->deviceCheck();
    }

	public function deviceCheck(){
		
		//ユーザーエージェント取得
		$this->ua = $_SERVER['HTTP_USER_AGENT'];

		if(strpos($this->ua,'iPhone') !== false){
			//iPhone
			$this->device = 'iphone';
		}
		elseif(strpos($this->ua,'iPad') !== false){
			//iPad
			$this->device = 'ipad';
		}
		elseif((strpos($this->ua,'Android') !== false) && (strpos($this->ua, 'Mobile') !== false)){
			//Android
			$this->device = 'android_m';
		}
		elseif(strpos($this->ua,'Android') !== false){
			//Android
			$this->device = 'android_t';
		}
		else{
			$this->device = 'pc';
		}
	}

	public function getDevice(){
		return $this->device;
	}
}

実行

$ua = new UserAgent();
echo $ua->getDevice();

getDevice()で所得する文字列でデバイスを判別する。

【PHP】配列に文字列が含まれるかどうかチェックする関数(2次元配列まで対応)

配列に文字列が含まれるかどうかチェックしたかったので関数を作ってみた。

※配列であり、その中のいずれかに文字列が含まれる場合”ture”を返す
※それ以外はすべて”false”を返す

////////////////////////////////////////////////////////////
// 配列に文字列が含まれるかどうかチェックする関数(2次元まで対応)
// funcArrCheck(配列)
////////////////////////////////////////////////////////////
function funcArrCheck($arr){
	if(is_array($arr)){
		foreach($arr as $value){
			if(is_array($value)){
				foreach ($value as $item) {
					if(isset($item) && $item <> ""){
						$boolean == true;
						break;
					}
				}		
			}else{
				if(isset($value) && $value <> ""){
					$boolean == true;
					break;
				}
			}
		}
	}
	
	if($boolean == true){
        return true;
    }
	
    return false;
}
////////////////////////////////////////////////////////////

そもそも配列じゃないものや、多次元のものも利用される可能性があるので、そちらにも対応しました。

【PHP】CSVファイルのデータを配列に入れて出力する関数

CSVファイルのデータをPHPで配列に入れてWEB上に出力する関数のサンプル。

<?php
// CSVファイル名を代入
$file_name = "test.csv";

$arr_csv = funcCsvArrPut($file_name);

// 配列の中身をみる
print_r($arr_csv);

////////////////////////////////////////////////////////////
// CSVファイルのデータを配列に代入する関数
// funcCsvArrPut(CSVファイル名)
////////////////////////////////////////////////////////////
function funcCsvArrPut($file_name){
	// CSVファイルを開く
	$file = fopen($file_name, "r");
	
	$cnt = 0;
	
	while(!feof($file)){
		$csv = fgets($file);
		$arr_csv[$cnt] = explode(",", $csv);
		$cnt++;
	}
	
	// CSVファイルを閉じる
	fclose($file);
	
	return $arr_csv;
}
////////////////////////////////////////////////////////////
?>

【PHP】セッションをクリアする関数

【PHPでセッションをクリアする関数】

<?php
////////////////////////////////////////////////////////////////////
// セッションをクリアする関数
// funcSessionClear();
////////////////////////////////////////////////////////////////////
function funcSessionClear(){
	$_SESSION = array();
	@session_destroy();
}
////////////////////////////////////////////////////////////////////
?>

【PHP】指定週と曜日(第n,w曜日)の日付を取得する

指定した週と曜日(第n,w曜日)から日付を取得する関数を作ってみた。

【第n,w曜日から指定日取得関数】

function funcDesignatedDay($n, $w){
	$year_val = date(Y); // 年を取得
	$month_val = date(m); // 月を取得
	
	$arr_week = array("日", "土", "金", "木", "水", "火", "月");
	
	for($i = 0; $i <= count($arr_week)-1; $i++){
		if($w == $arr_week[$i]){
			$w_no = $i;
		}
	}
	
	// 曜日番号を取得(0:日曜日~6:土曜日)
	$week_no = date('w',strtotime("$year_val/$month_val/1"));
	
	$d = (7*$n)+1;
	if((8 - ($week_no + $w_no)) <= 0){
		$day = ($d - ($week_no + $w_no) + 7);
	}else{
		if($w_no == 0 && $week_no == 0){
			$day = ($d - ($week_no + $w_no) - 7);
		}else{
			$day = ($d - ($week_no + $w_no));
		}
	}
	return $day;
}

実際に指定日を取得してみる

【使用例】

<?php
$n = 2; // 第n
$w = "日"; // w曜日

echo funcDesignatedDay($n, $w);


function funcDesignatedDay($n, $w){
	$year_val = date(Y); // 年を取得
	$month_val = date(m); // 月を取得
	
	$arr_week = array("日", "土", "金", "木", "水", "火", "月");
	
	for($i = 0; $i <= count($arr_week)-1; $i++){
		if($w == $arr_week[$i]){
			$w_no = $i;
		}
	}
	
	// 曜日番号を取得(0:日曜日~6:土曜日)
	$week_no = date('w',strtotime("$year_val/$month_val/1"));
	
	$d = (7*$n)+1;
	if((8 - ($week_no + $w_no)) <= 0){
		$day = ($d - ($week_no + $w_no) + 7);
	}else{
		if($w_no == 0 && $week_no == 0){
			$day = ($d - ($week_no + $w_no) - 7);
		}else{
			$day = ($d - ($week_no + $w_no));
		}
	}
	return $day;
}
?>

【実行結果】

(2012.8現在)
12

【PHP】配列の中身を並び替える(反転ソート)

配列の中身を反転(逆順)にソートする関数を作ってみた。

【配列反転用関数】

function funcArrRearrange($arr){
	$c = count($arr)-1;
	for($i = 0; $i <= count($arr)-1; $i++){
		$arr_after[$i] = $arr[$c];
		$c--;
	}
	return $arr_after;
}

実際に配列の中身を反転してみる

【使用例】

<?php
// 配列に値を代入する
$arr_before = array("AKB48","SKE48","NMB48","HKT48");

print_r($arr_before); // 配列の中身を確認(反転前)
echo "<br />";

print_r(funcArrRearrange($arr_before)); // 配列の中身を確認(反転後)

function funcArrRearrange($arr){
	$c = count($arr)-1;
	for($i = 0; $i <= count($arr)-1; $i++){
		$arr_after[$i] = $arr[$c];
		$c--;
	}
	return $arr_after;
}
?>

【実行結果】

Array ( [0] => AKB48 [1] => SKE48 [2] => NMB48 [3] => HKT48 ) 
Array ( [0] => HKT48 [1] => NMB48 [2] => SKE48 [3] => AKB48 )