戻る

正規表現

ある文字について、「○○ではじめって、××で終わる」や、「○○か△△か□□を含んでいる」あるいは「ここまでは○○、この記号の後は△△である」など、複雑な検索や置換を1度に行うパターンチェック方法のことです。

preg_match()関数

パターンチェックする

PHPにはerag()関数もありますが、preg_match()関数のほうが、速く動作します。

preg_match()関数の構文

数値(0,1) = preg_match(/正規表現パターン/,検索する文字列[,結果配列[,フラグ;PREG_OFFSET_CAPTURE[,検索の開始位置]);

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

数字をチェックする正規表現

<?php
header("Content-type: text/html; charset=utf-8");

$moji = "ABCabc123";
echo "{$moji}を正規表現チェック<br><br>";

echo "0~9までの数字があるかチェック<br>";
//数字の「0~9」が含まれているか
if(preg_match("/[0-9]/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "5ケタの4から9文字までの数字だけの文字が含まれているかどうかチェック<br>";
//{}で桁数を条件に追加
if(preg_match("/[4-9]{5}/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "2~4桁の1から5までの数字だけの文字が含まれているかどうかチェック<br>";
//{2,4}と「,(カンマ)」で区切ると「2~4」桁の間と桁数に幅を持たせた指定が可能
if(preg_match("/[1-5]{2,4}/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "8桁以上の4から7までの数字だけの文字が含まれているかどうかチェック<br>";
//{}で桁数と、「,(カンマ)」で指定桁数以上という条件を指定が可能
if(preg_match("/[4-7]{8,}/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "1桁以上の4から7までの数字だけの文字が含まれているかどうかチェック<br>";
//「1桁以上」という条件は「+(プラス)」記号の省略形でも記述可能
if(preg_match("/[4-7]+/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "0以上の4から7までの数字だけの文字が含まれているかどうかチェック<br>";
//「0以上」という条件は「*(アスタリスク)」記号の省略形でも記述可能
if(preg_match("/[4-7]*/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}
?>

英字をチェックする正規表現

<?php
header("Content-type: text/html; charset=utf-8");

$moji = "ABCabc123";
echo "{$moji}を正規表現チェック<br><br>";

echo "AからZまでの英字があるかないかをチェック<br>";
//「*(アスタリスク)」記号の指定で0回以上の繰り返しにマッチ
if(preg_match("/[A-Z]/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "aからzまでの英字があるかないかをチェック<br>";
//小文字と大文字は区別して指定する
if(preg_match("/[a-z]/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "aからzまたはAからZまでの英字があるかないかをチェック<br>";
if(preg_match("/[a-zA-Z]/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "8桁以上の英字の文字含まれているかどうかチェック<br>";
if(preg_match("/[a-zA-Z]{8,}/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "Pが1文字以上含まれているかをチェック<br>";
//「+(プラス)」記号の指定で1回以上の繰り返しにマッチ
if(preg_match("/P+/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}
?>

その他

<?php
header("Content-type: text/html; charset=utf-8");

$moji = "ABCabc123";
echo "{$moji}を正規表現チェック<br><br>";

echo "Aではない文字がある場合チェック<br>";
if(preg_match("/[^A]/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "数字以外が1文字以上含まれている場合チェック<br>";
//[]内の最初の文字が「^」の場合は、[]内中の文字を含まないという意味
if(preg_match("/[^0-9]+/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "AAAではじまっているかチェック<br>";
//[]でない場所に「^」がある場合、始まりが「^」直後の文字列のときにチェックするという意味
if(preg_match("/^AAA/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo "BBで終わっているかチェック<br>";
//$がつくと最後は「$」直前で指定した文字列かをチェック
if(preg_match("/BB$/",$moji)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}
?>

電話番号をチェックする正規表現

<?php
header("Content-type: text/html; charset=utf-8");

$tel = "03-1234-5678";

// [0-9-]*		0個以上の数字(0~9)とハイフンのみで構成されている文字列にマッチ
$check1 = "/^[0-9-]*$/";

// [0-9]{3}-	数字(0~9)3個の次がハイフン
// [0-9]{4}-	数字4個の次がハイフン
// [0-9]{4}		数字4個
$check2 = "/^[0-9]{3}-[0-9]{4}-[0-9]{4}$/";

// [0-9]{2,4}-	数字(0~9)2~4個の次がハイフン
// [0-9]{2,4}-	数字(0~9)2~4個の次がハイフン
// [0-9]{4}		数字4個
$check3 = "/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{4}$/";

echo "電話番号:{$tel}<br><br>";

echo $check1 . "<br>";
if(preg_match($check1,$tel)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo $check2 . "<br>";
if(preg_match($check2,$tel)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo $check3 . "<br>";
if(preg_match($check3,$tel)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}
?>

メールアドレスをチェックする正規表現

<?php
header("Content-type: text/html; charset=utf-8");

$email = "aaa@bbb.ccc";

// [^@]+@			@以外の文字の1回以上の繰り返しの次は@
// ([-a-z0-9]+\.)+	ハイフンと小文字英字と数字の1回以上の繰り返しの次はドット(.)。<=()*でさらにその1回以上の繰り返し
// [a-z]{2,}		2文字以上の小文字英字
$check1 = "/^[^@]+@([-a-z0-9]+\.)+[a-z]{2,}$/";

// [a-zA-Z0-9_\.\-]+?@	英数字、ハイフン、アンダーバー、ドットののいずれかの1回以上の繰り返しの次は@。?があることで[a-zA-Z0-9_\.\-]と@で囲まれた文字列のうち最も短いものにマッチ
// [A-Za-z0-9_\.\-]+	英数字、ハイフン、アンダーバー、ドットのいずれかの1回以上の繰り返し
$check2 = "/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$/";

// [a-zA-Z0-9_\.\-]+?@	英数字、ハイフン、アンダーバー、ドットののいずれかの1回以上の繰り返しの次は@
// [A-Za-z0-9_\.\-]+\.	英数字、ハイフン、アンダーバー、ドットのいずれかの1回以上の繰り返しの次はドット(.)
// [A-Za-z0-9_\.\-]+	英数字、ハイフン、アンダーバー、ドットのいずれかの1回以上の繰り返し
$check3 = "/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+\.[A-Za-z0-9_\.\-]+$/";

echo "メールアドレス:{$email}<br><br>";

echo $check1 . "<br>";
if(preg_match($check1,$email)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo $check2 . "<br>";
if(preg_match($check2,$email)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}

echo $check3 . "<br>";
if(preg_match($check3,$email)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}
?>

URLをチェックする正規表現

<?php
header("Content-type: text/html; charset=utf-8");

$url = "http://aaa.bbb.ccc";

// (https?|ftp|news)(://				@以外の文字の1回以上の繰り返しの次は@
// [[:alnum:]\+\$\;\?\.%,!#~*\/:@=_-]+)	英数字か、+$;,?.%!#~*/:@&=_-のいずれかの1回以上の繰り返し
$check = "{(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*\/:@=_-]+)}";

echo "URL:{$url}<br><br>";

echo $check . "<br>";
if(preg_match($check,$url)){
	echo "○<br><br>";
}
else{
	echo "×<br><br>";
}
?>

デリミタは「//」以外にも「()」「{}」「[]」「<>」、その他バックスラッシュ以外のすべての文字が使えます。

日本語をチェックするmb_ereg()関数

<?php
header("Content-type: text/html; charset=utf-8");

$moji = "aaaあいうえおbbbアイウエオcccc";

//ひらがながあるかないかをチェック
echo mb_ereg("[あ-ん]",$moji);

//カタカナがあるかないかをチェック
echo mb_ereg("[ア-ン]",$moji);

?>

preg_replace()関数

正規表現で検索した文字列を置換

preg_replace()関数の構文

置換後の文字列 = preg_match(/正規表現パターン/,置換内容,置換元文字列[,最大指定置換回数(デフォルト:-1無制限)][,置換された回数(PHP5.1.0より)]);

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

URLをリンクタグに変換する

<?php
header("Content-type: text/html; charset=utf-8");

$url = "http://aaa.bbb.jp";

$check = "{(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*\/:@=_-]+)}";

$link = preg_replace($check,"<a href=\" . $1$2 . \">$1$2</a>",$url);

echo $link;
?>

<>で囲まれたHTMLタグを削除した文字列を作成

<?php
header("Content-type: text/html; charset=utf-8");

$url = "<a href=\"http://aaa.bbb.jp\">http://aaa.bbb.jp</a>";

$check = "/<.*?>/";

$link = preg_replace($check,"",$url);

echo $link;
?>

国内電話番号を国際電話番号に置換する

<?php
header("Content-type: text/html; charset=utf-8");

$domestic = "06-1234-5678";

$international = preg_replace("/^(0)([0-9]{1,3}-[0-9]{2,4}-[0-9]{4})$/","+81-$2",$domestic);

echo $international;
?>

inserted by FC2 system