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

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

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

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

3241閲覧

PHPで、ASCIIコードの文字列をバリデーションしたい

YU654

総合スコア14

ASCII

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/09/02 11:36

編集2020/09/02 11:51

前提

8文字から32文字の長さで入力された文字列を16進数のASCIIコードへ変換して、以下のような文字列を作成します。

入力文字列:4567 8!"#$%&'()`~a
出力文字列:34.35.36.37.20.38.21.22.23.24.25.26.27.28.29.60.7e.61.

この出力文字列を別の入力処理へ送信して、受信側にてこの文字列を PHPの正規表現を用いて0x20から0x7eの文字を用いた8文字から32文字(変換しているので24文字から96文字?)であるかのバリデーションを行います。

行ったこと

バリデーションを行うことが目的であったため、コールバック関数を用いて、
filter_var($strings, FILTER_CALLBACK, array('options'=>'valid_ascii'));
の言った感じでコールバック関数を用意してバリデーションを行うようにしたのですが、正規表現で実施してほしいと言われてしまいました。

しかし、当方、正規表現は全く経験がないため、困り果てております。

本件に対する正規表現について知識をお持ちの方がいらっしゃいましたら、ぜひともお知恵を拝借させていただきたいです。
よろしくお願いいたします。

使用環境:CentOS7.4 PHP7.2.33

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

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

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

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

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

maisumakun

2020/09/02 11:38

えっと、入力ではなく「出力」に対してバリデーションするのはどういう目的でしょうか?
YU654

2020/09/02 11:44

この出力結果を更に別の入力に使用するため、変換結果が正しく実施されているかをバリデーションする必要があるようです。 よろしくお願いいたします。
guest

回答2

0

この出力結果を更に別の入力に使用するため、変換結果が正しく実施されているかをバリデーションする必要があるようです。

それは「バリデーション」で実行することではなく、テストコードで保証する、というほうが適切な態度ではないかと思います。

実行中にバリデーションが失敗した場合、どのように動作させるかまで考えないといけなくなってしまいます。

投稿2020/09/02 11:51

maisumakun

総合スコア146018

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

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

0

ベストアンサー

お知恵っていうか、たぶん説明を加えていくと、
コードを書いたほうが早いんじゃないか?
っておもっちゃうんですけど、
質問者さんは1行もコードを書いてないんでしょうか?

私が試しに書いたコードを解説すると、
0x20 - 0x7e と「.」の3文字セットが繰り返しているわけですから、
セットがpreg_match_all()を使ってヒットした個数を求めて、
そもそも判定対象文字列の文字数も求めて、
判定対象文字列の文字数 ÷ 3 === ヒットした個数
であれば正解、
というふうに考えてみました。

セットについて、
1文字目は2~7ですよね。
2文字目は一見0~fなのですが、
7fは除外するため、
1文字目が2~6の場合は2文字目は0~f
または
1文字目が7の場合は2文字目は0~e
っていう正規表現を書けばいいとわかります。

ここまでヒントを出したので、
少しでもコードを書いてみませんか?

投稿2020/09/02 12:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YU654

2020/09/02 22:28

ヒントありがとうございます。 /([2-6][0-9a-f]|7[0-e]).{24,96}/ こういった感じでしょうか? > ヒットした個数を求めて というのがわからなかったので、24文字から96文字としてみました。 しかし、うまく動作しません。 2セット目以降にはffが入っても全角文字が入っても通ってしまいます。 継続して調査してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問