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

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

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

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

正規表現

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

Q&A

解決済

2回答

441閲覧

サブマッチパターンの文字列について

aae_11

総合スコア178

PHP

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

正規表現

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

0グッド

0クリップ

投稿2019/07/06 00:05

編集2019/07/06 00:06

こちらQiitaの記事を拝見させて貰い学習をしていたのですが、分からない部分がありお聞きしたい箇所がございます。
以下は該当のコードです。

function is_valid_email($email, $check_dns = false) { switch (true) { case false === filter_var($email, FILTER_VALIDATE_EMAIL, FILTER_FLAG_EMAIL_UNICODE): case !preg_match('/@([^@[]++)\z/', $email, $m): return false; case !$check_dns: case checkdnsrr($m[1], 'MX'): case checkdnsrr($m[1], 'A'): case checkdnsrr($m[1], 'AAAA'): return true; default: return false; } }

こちらのコードの!preg_match('/@([^@[]++)\z/', $email, $m):変数$m[1]にはキャプチャ用のサブマッチパターンの文字列が入るかと思いますが、上記コードにおけるサブマッチパターンの文字列とは、例えば $emailの中身が「test123@yahoo.co.jp」でしたら、「@yahoo.co.jp」が該当するということでしょうか?
ご助言頂けましたら幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

「@yahoo.co.jp」が該当するということでしょうか?

いいえ。
何故そう思ったのでしょうか?「サブマッチ」の意味を理解できていないと思います。

投稿2019/07/06 00:24

otn

総合スコア84557

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

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

aae_11

2019/07/06 00:30

最初の@は含まれないですよね... 勘違いしていました...
otn

2019/07/06 00:37

はい。それで合っています。
otn

2019/07/06 00:41

1つの概念を学ぶ度に、自分が正しく理解できているかを他人に質問していてはきりがありません。 te2jiさんの回答のように、自分の理解が正しいかは実行してみて確認しましょう。 ちょっとしたプログラム実行なら、自分で開発環境を整えなくても、ウェブ上で実行できるサイトがたくさんあります。
aae_11

2019/07/06 00:44

そうですね... つまずいた際は自分で確認できないか、良く考えたいと思います。
aae_11

2019/07/06 00:57

otnさん、すみません。 実は、記載しましたコードについて、まだ一点お聞きしたいことがあるのですが、教えて貰ってもよろしいでしょうか...?
otn

2019/07/06 11:30

なんでしょうか?
aae_11

2019/07/07 08:13

switch文の「case !preg_match('/@([^@[]++)\z/', $email, $m):」こちらなのですが、trueの場合はpregmatchの前の「!」マークにより「false」となり、結果的に次の行でreturn falseはされません。これはバリデーション的には、@の次に、@[ が来てもfalseにはならない為、逆なのではないかなと思ったのですが、何故pregmatchの前に「!」マークが入っているのでしょうか...?
otn

2019/07/07 08:42

@の次に@や[が来ると、このマッチが失敗するので、!をするとtrueになり、リターンします。 foo@[192.168.0.1] のようなメールアドレスをはじきたい(return false) ということです。 一方、普通の foo@bar.baz のような普通のメールアドレスなら、マッチが成功して ! がfalseになるので、次のcaseに進みます。 ということで、ロジックになれていないとこの記述はわかりにくいと言うことですね。 case preg_match('/@.*[@[]/', $email, $m): が同じ結果ですが、こちらが素直でしょう。 「ひとつでも~があれば」==「『すべてが~以外であれば』の否定」
aae_11

2019/07/07 08:50

ご返信ありがとうございます。 @の次に@や[が来た場合マッチが失敗するとのことなのですが、pregmatchはパターンに一致した場合マッチが成功する為、逆にマッチが成功してしまうのではないかなと思うんですよね... この点に関しましては、いかがでしょうか...?
otn

2019/07/07 09:13

[^@[] の意味を理解していないのでは?
aae_11

2019/07/07 09:25

あ、そうでした... ^を文字列の先頭と勘違いしていました...この場合は否定の意味ですよね...
guest

0

ベストアンサー

やってみれば?

php

1$email = "test123@yahoo.co.jp"; 2preg_match('/@([^@[]++)\z/', $email, $m); 3var_dump($m);

投稿2019/07/06 00:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問