忍者ブログ

からすまる日誌 mySQL

授業ノートのまとめ

高度(21) 正規表現のみを抽出

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

高度(21) 正規表現のみを抽出

うにゃうにゃした内容物から「正規表現」のものを探し当てたい
 
<?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にいく
PR

コメント

ただいまコメントを受けつけておりません。

プロフィール

HN:
karasumaru
性別:
非公開

P R