10進数、2進数、8進数、16進数を相互に変換できる入力フォームを作っています。
PHP
1base_convert()
を使う事により基数変換ができるようになり、とりあえず基数変換については実装できました。
加えて、ふさわしくない入力が与えられた場合にエラーを表示するような機能を付けたいと思い、実装中です。
例えば2進数の場合は、入力の文字列が0と1のみで構成されているべきだと思ったので、0と1以外の文字が混入した場合はエラーを表示したいです。
8進数の場合も同様で、0~7以外の文字が混入した場合はエラーを表示したいです。
そこで、2進数か否か、8進数か否か、10進数か否かチェックする関数を作ろうと思いました。
調べてみたところ、for文で一桁ずつチェックするより正規表現の方が便利そうだったので、それを使ってみました。
PHP
1//$strが0と1以外を含んだ場合(2進数として成立していない場合)false 2function is_bin($str){ 3 if (preg_match("/^[0-1]/", $str)) { 4 return false; 5 } 6 return true; 7}
これで、$strに0と1以外が含まれたときにfalseが返り、$strが0と1のみで構成されていればtrueが返るようになるだろうと考えました。
しかし、動かしてみると上記の自分の考えと正反対の動きをします。
8進数や10進数かふさわしいかを判定する関数も同様です。↓
PHP
1//$strが0~7以外を含んだ場合(8進数として成立していない場合)false 2function is_octal($str){ 3 if (preg_match("/^[0-7]/", $str)) { 4 return false; 5 } 6 return true; 7}
$strに0~7以外の文字が入っているのかいないのかを判定しようとしています。
仮に9やxなど8進数として適切ではない文字が混入していた場合falseを返そうとしています。
しかし自分の思惑と対照的な動きをするので、何か根本的に勘違いをしていると思います。
間違っている部分、何かヒントがあればご教示願いたいです。よろしくお願いいたします。
実際に動かしているコードはこちらです。このファイルのみで現在動かしています。↓
PHP
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <link rel="stylesheet" href="./css/style.css"> 7 <title>test</title> 8</head> 9<body> 10 <form action="./test.php" method="POST" class="form"> 11 <select name="before"> 12 <option value="10">10進数</option> 13 <option value="2">2進数</option> 14 <option value="8">8進数</option> 15 <option value="16">16進数</option> 16 </select> 17 を 18 <select name="after"> 19 <option value="10">10進数</option> 20 <option value="2">2進数</option> 21 <option value="8">8進数</option> 22 <option value="16">16進数</option> 23 </select> 24 に変換 25 </p> 26 <p>変換前:<input type="text" name="num"></p> 27 <input type="submit" name="submit" value="変換"> 28 </form> 29 <?php 30 31 function is_bin($str){ 32 if (preg_match("/^[0-1]/", $str)) { 33 return false; 34 } 35 return true; 36 } 37 38 function is_octal($str){ 39 if (preg_match("/^[0-7]/", $str)) { 40 return false; 41 } 42 return true; 43 } 44 45 function is_dec($str){ 46 if (preg_match("/^[0-9]/", $str)) { 47 return false; 48 } 49 return true; 50 } 51 52 function is_n_num($str, $n){ 53 if($n == '2'){ 54 return is_bin($str); 55 }else if($n == '8'){ 56 return is_octal($str); 57 }else if($n == '10'){ 58 return is_dec($str); 59 }else if($n == '16'){ 60 return ctype_xdigit($str); 61 }else { 62 return false; 63 } 64 } 65 66 $err_message = array(); 67 68 if(isset($_POST['submit'])){ 69 $num = $_POST['num']; 70 $before = $_POST['before']; 71 $after = $_POST['after']; 72 73 $base_num_arr = array('10','2','8','16'); 74 75 if(empty($num)){ 76 $err_message[] = '入力して下さい。'; 77 } 78 79 for($i = 0;$i < count($base_num_arr);$i++){ 80 for($j = 0;$j < count($base_num_arr);$j++){ 81 $is_ans = $base_num_arr[$i] == $before && $base_num_arr[$j] == $after; 82 if($is_ans && is_n_num($num,$before)){ 83 $ans = base_convert($num, $before, $after); 84 break; 85 }else if(!is_n_num($num,$before)){ 86 $err_message[] = 'ERROR!:不正な値です'; 87 break; 88 } 89 } 90 if(isset($ans) || !empty($err_message)){ 91 break; 92 } 93 } 94 } 95 if(isset($ans)){ 96 echo '<p class="answer">' . $before . '進数から' . $after . '進数へ変換しました -> '; 97 echo '<p class="answer">' . $ans . '</p>'; 98 } 99 foreach($err_message as $err){ 100 echo '<p class="err-message">' . $err . '</p>'; 101 } 102 103 ?> 104</body> 105</html>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/02 08:40
2021/08/02 08:55