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

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

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

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

正規表現

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

Q&A

解決済

4回答

3643閲覧

16進数の正規表現について

ms5025

総合スコア292

PHP

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

正規表現

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

0グッド

0クリップ

投稿2021/11/24 05:36

前提・実現したいこと

以下の16真数の値を正規表現でチェックしたいです

x3040~x3096

の値をチェックするのに以下のようにしましたが
正しく正規表現チェックできません
どこがおかしいのでしょうか?

/\A[\x{3041}-\x{3096}]*\z$/u

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

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

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

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

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

guest

回答4

0

ベストアンサー

あなたの言う「16進数」とは具体的に何のことですか?

お書きの正規表現は、ユニコードの文字のコードポイントを指定してある範囲の文字(この例だとひらがなか)を判別するための物です。ひらがな文字を判断したいのなら、それでいいです。上端下端は調整が必要かも。

"x3040"のような文字列データ(文字xの後に16進文字が4つ続いた文字列)のことを言っているのであれば、1文字じゃなくて5文字の文字列としてマッチする正規表現が必要なので、文字クラスで範囲指定という話では無いです。
⇒ yambejpさんの回答。

0x3040の様な整数値の16進数表現の事であれば、正規表現でなく、大小比較でしょう。

PHP

1$v = 0x3044; 2if($v>=0x3040 && $v<=0x3096) {

投稿2021/11/24 06:25

otn

総合スコア84857

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

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

ms5025

2021/11/24 06:35

正規表現で\x{3041}-\x{3096}\ のようなこういった範囲指定ってできるものなのでしょうか?
otn

2021/11/24 06:48

どういうことって、回答に書いたとおりです。 > ユニコードの文字のコードポイントを指定してある範囲の文字(この例だとひらがなか)を判別するための物です。 この文章が理解できないと言うことなのでしょうか? > 正規表現で\x{3041}-\x{3096}\ のようなこういった範囲指定ってできるものなのでしょうか? ユニコードの文字のコードポイントを指定してある範囲の文字を判別するための物なら文字クラスの中で使用可能です。
ms5025

2021/11/24 07:04

ひらがなを上記コードポイントに変換して上記の正規表現をかけてもかからないということでしょうか? まずひらがな「あ」をコードポイントx3041に変換し、 それでpreg_matchをかけました そうではなく、「あ」をそのまま上記の正規表現にかける、ということなのでしょうか?
ms5025

2021/11/24 07:05

そういうことなんですね、全く勘違いをしていました。
otn

2021/11/24 09:37

理解されたようですが、質問文記載の正規表現は、"あ"という文字列にはヒットしますが、"x3041"という文字列にはヒットしません。
guest

0

'/\A[\x{3041}-\x{3096}\x{309D}\x{309E}\x{3000}\x{30FC}]*\z$/u'

こういった正規表現があったので。こんなふうに範囲指定ができるのかなと思ったんですが

PHP 7.4.16 では上記の正規表現で問題はないですね。。。

一応、「ひらがな」には Unicode 文字プロパティ を使うことができますので以下の様にも書けます。

<?php echo preg_match("/\A[\p{Hiragana}\u{3000}\u{309d}\u{309e}\u{30fc}]*\Z/u", "ぁ ゝかはゃゖゞ") . "\n"; echo preg_match("/\A[\p{Hiragana}\u{3000}\u{309d}\u{309e}\u{30fc}]*\Z/u", "aあいうえお ゞ") . "\n"; # 1 0

x309A-x309F までを範囲指定することはできないのでしょうか? \x{3041}-\x{3096} の数字なら範囲で指定できますが、x309A-x309F は一つずつ指定しなくてはいけないのでしょうか?

php

1<?php 2 3echo preg_match("/\A[\u{309A}-\u{309F}]*\Z/u", "゚゛゜ゝゞゟ") . "\n"; 4 5# 61

投稿2021/11/24 10:24

編集2021/11/24 11:44
melian

総合スコア19912

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

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

ms5025

2021/11/24 10:40 編集

ありがとうございます。 それを使おうかどうしようか迷っていました ちなみに x309Aーx309F までを範囲指定することはできないのでしょうか? \x{3041}-\x{3096} の数字なら範囲で指定できますが、x309Aーx309Fは一つずつ指定しなくてはいけないのでしょうか?
ms5025

2021/11/26 01:05

ありがとうございます。すごく助かりました。
guest

0

![イメージ説明
PHP v7.4.21で試して見ましたが問題はありません。

正しく正規表現チェックできません

とはどう言う事ですか説明できますか?

できればテストケースをお願いします。
どのテキストに対して、どの文字がチェックされてないのか、どの文字がチェックされないはずなのにチェックされたのか、例をお願いします。

投稿2021/11/24 08:04

skys215

総合スコア910

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

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

ms5025

2021/11/26 01:05

すみません、勘違いしていました。
guest

0

x30(4[1-9a-f]|[5-8][0-9a-f]|9[0-6])あたりをチェックすればよいのでは?

投稿2021/11/24 05:58

編集2021/11/24 06:00
yambejp

総合スコア115100

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

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

ms5025

2021/11/24 06:02

そうかなと思ったのですが16進数で上記のようにチェックできないものかと・・ https://knooto.info/input-validation-hiragana/ ここに '/\A[\x{3041}-\x{3096}\x{309D}\x{309E}\x{3000}\x{30FC}]*\z$/u' こういった正規表現があったので。こんなふうに範囲指定ができるのかなと思ったんですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問