質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1049閲覧

渡した変数が2進数や8進数の形式になっているか否か判定したいです

y_programming

総合スコア48

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/08/02 08:35

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> 1718 <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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$strに0と1以外が含まれたときにfalseが返り、$strが0と1のみで構成されていればtrueが返るようになるだろうと考えました。

角括弧の外側に書いた^は否定ではなく、文字列の先頭(設定やエンジンによっては行頭も)という意味になります。

「特定の文字以外」を意味させたい場合は、[^0-1]のように、角括弧内の最初に書く必要があります。

投稿2021/08/02 08:38

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_programming

2021/08/02 08:40

!! ありがとうございます、さっそくやってみます!!
y_programming

2021/08/02 08:55

できました・・・! 角括弧の外側に書いた^を否定と勘違いしておりました。 今回の場合$strの先頭をチェックしてしまっていたのですね。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問