ある文字について、「○○ではじめって、××で終わる」や、「○○か△△か□□を含んでいる」あるいは「ここまでは○○、この記号の後は△△である」など、複雑な検索や置換を1度に行うパターンチェック方法のことです。
パターンチェックする
PHPにはerag()関数もありますが、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>"; } ?>
<?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>"; } ?>
デリミタは「//」以外にも「()」「{}」「[]」「<>」、その他バックスラッシュ以外のすべての文字が使えます。
<?php header("Content-type: text/html; charset=utf-8"); $moji = "aaaあいうえおbbbアイウエオcccc"; //ひらがながあるかないかをチェック echo mb_ereg("[あ-ん]",$moji); //カタカナがあるかないかをチェック echo mb_ereg("[ア-ン]",$moji); ?>
正規表現で検索した文字列を置換
置換後の文字列 = preg_match(/正規表現パターン/,置換内容,置換元文字列[,最大指定置換回数(デフォルト:-1無制限)][,置換された回数(PHP5.1.0より)]);
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
<?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; ?>
<?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; ?>