うにゃうにゃした内容物から「正規表現」のものを探し当てたい
<?php
for($i=0; $i<300; $i++) {
$y = rand(1970, 2020);
$m = rand(1, 12);
if($m == 2) {
$d = rand(1, 28);
} elseif($m == 4 || $m == 6 || $m == 9 || $m == 11) {
$d = rand(1, 30);
} else {
$d = rand(1, 31);
}
if($i % 11 == 0) {
echo "<div>{$y}_{$m}_{$d}</div>\n";
} elseif($i % 17 == 0) {
echo "<div>{$y}-{$m}{$d}</div>\n";
} else {
echo "<div>{$y}-{$m}-{$d}</div>\n";
}
}
?>
このプログラムで出力されたものをサクラエディタに貼り付ける
正しいものもあかんやつも混じってる300個の日付
正規表現を検索するのはサクラエディタの普通の検索にある
メタ文字
ある種の文字を指定するための特殊な文字のこと
アルファベットを指定したかったら\w
数字は\d
¥は環境によってバックスラッシュで出ることもあるが意味は同じ
さて、年について。数字が4つ続くという正規表現
→\d\d\d\d
しかし美しくない
\d{4}
これでよい
月は1桁か2文字かわからない
揺れがあるときはカンマを使う
\d{1,2}
1つか2つ
日も1から31まであって一桁化二けたかわからない
→
\d{1,2}
\d{4}-\d{1,2}-\d{1,2}
しかしこれだと、
「この前にほげほげ」「この後にほげほげ」が付いていてもヒットしてしまうので、
^
これが最初の印(ひらがなのへのところにある)
$
これがラストの印
^\d{4}-\d{1,2}-\d{1,2}$
じゃあ正しいやつを「年月日」に変えたい
置換する
置換前 ^\d{4}-\d{1,2}-\d{1,2}$
→ここはそのままにしてほしい、というところを丸括弧で囲う
→
^(\d{4})-(\d{1,2})-(\d{1,2})$
この丸括弧は配列っぽく記憶されるらしい
1つめの記憶、2つ目の記憶、3つ目の記憶みたいになるらしい
丸括弧の1つめが \1 となる
よって置換後は
\1年\2月\3日
文字を表すメタ文字はドットもしくはプラス
数字でも文字でもなんでもいいよというメタ
. あるかもしれないし、ないかも
+ 最低1文字はある
という違いがある
メタ文字を詳しくなりたかったらそういう本を読むこと
さてサクラエディタのやり方はこのとおり
ではプログラムでどう利用するか
ハイフン付きで郵便番号の正規表現なら?
^(\d{3})-(\d{4})$
スクリプトで検証してみましょう
値を取得するのはvalメソッド
ここが空っぽの場合は別処理が必要だが今回は割愛
var zip = $('#zipcode').val();
matchというのがパターンマッチングをするメソッド
結果は配列データとして受け取れる
よって
var arr = zip.match();//この配列が空ならマッチしてない
メタ文字は特別な予約語になっているので
はじまりとおわりをスラッシュにする決まり
var arr = zip.match(/^(\d{3})-(\d{4})$/);
「スラッシュで囲ったものは正規表現のメタ文字だ」と解釈される
正規表現にあってないとnullが返る
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>submitを止める</title>
<script src="../jquery-3.4.1.min.js"></script>
</head>
<body>
<form action="stop_submit2.php" method="post" id="f1">
<p>郵便番号をハイフン付きで入力してください</p>
<p>
<input type="text" name="zipcode" id="zipcode">
<button type="submit">送信</button>
</p>
<p id="msg"></p>
</form>
<script>
$(function(){
console.log("hoge");
$('#f1').on('submit',function(event_hoge){
/*
var flag = confirm('送信しますか?');//okかcancel押すかでflagにtrueかfalseが入る
if(!flag){//偽の時は
event_hoge.preventDefault();//発生したイベントが無になる
}
*/
//バリデーション
var zip = $('#zipcode').val();//取得
var arr = zip.match(/^(\d{3})-(\d{4})$/);//この配列が空ならマッチしてない
console.log(arr);
event_hoge.preventDefault();
});
});
</script>
</body>
</html>
じゃあif文でnullかどうか見ればいい
nullならとめて警告を出し、
マッチしたら次のページに行く
stop_submit1.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>submitを止める</title>
<script src="../jquery-3.4.1.min.js"></script>
</head>
<body>
<form action="stop_submit2.php" method="post" id="f1">
<p>郵便番号をハイフン付きで入力してください</p>
<p>
<input type="text" name="zipcode" id="zipcode">
<button type="submit">送信</button>
</p>
<p id="msg"></p>
</form>
<script>
$(function(){
console.log("hoge");
$('#f1').on('submit',function(event_hoge){
/*
var flag = confirm('送信しますか?');//okかcancel押すかでflagにtrueかfalseが入る
if(!flag){//偽の時は
event_hoge.preventDefault();//発生したイベントが無になる
}
*/
//バリデーション
var zip = $('#zipcode').val();//取得
var arr = zip.match(/^(\d{3})-(\d{4})$/);//この配列が空ならマッチしてない
//console.log(arr);
if(arr==null){
event_hoge.preventDefault();//submitを無効化してとめる
$('#msg').text("半角英数で7桁の郵便番号をハイフン付きで!");
}
});
});
</script>
</body>
</html>
phpでも同じことが出来る
php manual
preg_match
https://www.php.net/manual/ja/function.preg-match.php
jsは引数1つでよかったが
phpは最低限2ついる
perlのぺくるというのを引き継いでいるらしい
0か1かで返る
matchしたら1
preg_replaceは置換を行う
ではphpでもやろう
<?php
$code="123-4567";//これが正しいかを検査する
$flag=
これをflagで受け取る
jsとは違って文字列として渡す
<?php
$code="123-45678";//これが正しいかを検査する
$flag= preg_match("/^\d{3}-\d{4}$/",$code);
if($flag){
echo ("matchしました");
}else{
echo ("not match");
}
?>
もし$codeが正しければmatchにいくし
だめならnot matchにいく