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

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

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

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

正規表現

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

Q&A

解決済

2回答

1114閲覧

PHP 複数の正規表現を行いたいです。

ty-ty

総合スコア3

PHP

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

正規表現

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

0グッド

0クリップ

投稿2021/10/07 10:19

編集2021/10/07 13:43

前提・実現したいこと

以下の3つを満たし、検索後にTRUE、 FOLSEを返したい

######(1)「大文字小文字の区別をしない」
例)テキストには「 difficult」があり、ユーザーが「DiffiCulT」と入力しても検索できるようにしたい。

######(2)「英単語ごとに完全に一致する単語を検索したい」
例)テキストには「 Big dog」があり、文字の大小区別せずユーザーが「big」か「dog」を入力すると検索できるようにしたい
今のままでは、b,i,g,d,o,gのいずれかを入力すると検索が出来てしまいます。

######(3)「ユーザーの複数入力した文字の先頭だけで検索したい」
例)テキストには「 I want to have a dog」があり、ユーザーが「want to」を入力しても「want」で検索したい

の3つをユーザー入力による検索で行いたいです。

######現在はユーザーが入力した文字が入った$inputを以下のように記載しているので、(1)が出来ています!
if (preg_match_all("/$input/i", $text))

現在の状況は、英単語ごとの「完全一致」が出来ていない為、テキスト内に含まれる「a」「b」「c」などの一字でもユーザー入力すると、TRUEになります。また不一致の場合はFALSEになることが確認できています。

*出来るだけテキスト内には正規表現行わない方法でご教授お願いしたいです。

該当のソースコードから、実装方法や参考情報などをご教授頂きたく存じます。

該当のソースコード

<?php $text = 'I am learning programming. It can be difficult, but it is fun to be able to implement it .'; // echo $text; // ユーザーによる入力 標準入力 $input= trim(fgets(STDIN)); // 部分一致 if (preg_match_all("/$input/i", $text)) { echo "Searching for".$input."in text"."\n"; echo "RESULT:TRUE"."\n"; } else { echo "Searching for".$input."in text"."\n"; echo "RESULT: FALSE"."\n"; } ?>

試したこと

先頭検索を行う際に
if (preg_match_all("/$input/i", $text))"/$input/i""/^$input/i"としましたがうまく処理が出来ませんでした。

  • preg_matchの使い方としてpreg_match(正規表現, 対象テキスト)ですが、preg_match(正規表現(変数), 対象テキスト)のように

ユーザーが入力した値が格納された変数$inputに、正規表現を行うことはできるのでしょうか。

実装例や参考情報を探しても中々実装出来ません。

ご拝読頂き誠にありがとうございます

お手隙の際に「実現したいこと」に記載されている内容をご教授いただけないでしょうか。

コメント・ご教授頂きました際には、迅速にご返信いたします。

ご協力のほど、宜しくお願い致します。

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

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

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

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

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

otn

2021/10/07 11:40 編集

「英単語ごとの完全一致」「文字完全一致」「文頭検索」あたりの言葉を間違って使っている気がします。 やりたいことを難しい言葉を使わず、記述してみましょう。
ty-ty

2021/10/07 13:33

前回の質問に引き続きコメントありがとうございます! アドバイスを頂き、以下のように質問の修正を行いました! また、実装方法についてご教授頂けましたら幸いです。 ====================== 改めて行いたいことは (1)「大文字小文字の区別をしない」 例)テキストには「 difficult」があり、ユーザーが「DiffiCulT」と入力しても検索できるようにしたい。 (2)「英単語ごとに完全に一致する単語を検索したい」 例)テキストには「 Big dog」があり、文字の大小区別せずユーザーが「big」か「dog」を入力すると検索できるようにしたい (3)「ユーザーの複数入力した文字の先頭だけで検索したい」 例)テキストには「 I want to have a dog」があり、ユーザーが「want to」を入力しても「want」で検索したい の3つをユーザー入力による検索で行いたいです。 現在はユーザーが入力した文字が入った$inputを以下のように記載しているので、(1)が出来ています! if (preg_match_all("/$input/i", $text)) =======================
guest

回答2

0

ベストアンサー

(1)「大文字小文字の区別をしない」

は、いいですよね?i修飾子です。

(2)「英単語ごとに完全に一致する単語を検索したい」

数字も含んでいいなら、\bが「英数字と英数字以外の境目」にマッチします。
つまり、\bxyz\bは、「前後が英数字でないxyz」にマッチします。
(厳密には、英数字と下線_です)

(3)「ユーザーの複数入力した文字の先頭だけで検索したい」

$inputexplode(" ",$input)で空白で分割して先頭要素を取るか、preg_replace("\s.*","",$input)で空白文字以降を削除します。

まとめると、

PHP

1$regexp = "/\b" . preg_replace("\s.*","",$input) . "\b/i";

$input/が含まれないという前提)

投稿2021/10/07 13:58

編集2021/10/07 14:00
otn

総合スコア85901

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

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

ty-ty

2021/10/08 02:02

(1)-(3)までご丁寧にご教授頂き、本当にありがとうございます、、、 otn様のご教授頂いたことを参考に以下のように記載すると ``` $regexp = preg_replace("/\s.*/","",$input); if (preg_match_all("/$regexp\b/i", $text)) ``` と記載する(1)-(3)の行いたいことが全て出来ました。 私は初学者で分からないことが多くありますが、学習を怠らず otn様のようにアドバイス等をご丁寧に出来るように、努めていきたいです! また、ご質問等するかと存じますが何卒宜しくお願い致します。
otn

2021/10/08 02:12

単語と完全一致だったのでは?先頭に \b つけなくていいんですか?
ty-ty

2021/10/08 03:10

ご返信ありがとうございます! また、ご教授頂いたにも関わらず、正確に記載できておらず申し訳ございません。 動作確認した際に偶然TRUEになってしまっていた事から、記載していた気になっていました。 その後、前後に\bをつけたことにより、「単語と完全一致」できていることを確認しました。 これからはしっかり記載後確認し抜けがないようにしていきます。 何度もご教授頂き誠に感謝申し上げます。 ご機会頂ければ、今後も宜しくお願い致します。
guest

0

正規表現を理解していないのでうまくいかないという感じでしょうか。

可能であれば、PHP マニュアル 関数リファレンス テキスト処理 PCRE PCRE のパターン を順番に読むところから初めてどのようなキーワードがどのような動作をするのかを把握すると理解が進むと思います。

正規表現「文字完全一致」と「文頭検索」 を実現し

ユーザー入力で入力された値が、テキスト内の英単語と一致すればTRUE,しなければFALSEと返したい。

文字完全一致 というのは、質問の中で後述されている英単語ごとの「完全一致」のことでしょうか。

そうであれば、マニュアルの エスケープシーケンス を読んでみましょう。

単語境界 (word boundary) とは、検索対象文字列において、 カレントの文字およびその前の文字が同時に \w もしくは \W にマッチしない(すなわち、片方が \w にマッチし、もう片方が \W にマッチする)位置、もしくは、文字列の始めか終わりで、 その始めか終わりの文字が \w にマッチする位置の ことです。

言明 \A, \Z, \z は、(アンカー で説明する)ハット記号やドル記号とは 異なり、オプション設定によらず、文字列の始端または終端だけに マッチします。これらの言明は、PCRE_MULTILINE および PCRE_DOLLAR_ENDONLY オプションの影響を受けません。 \Z と \z との違いは、 \Z は文字列の末尾の改行の前の位置および文字列の 終端にマッチするのに対し、\z は文字列の終端にのみ マッチすることです。

あたりが該当する内容と思います。

投稿2021/10/07 11:14

CHERRY

総合スコア25218

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

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

ty-ty

2021/10/07 13:29

コメント頂き誠にありがとうございます! 文字完全一致 というのは、英単語ごとの「完全一致」のことです!分かりにくい記載をしてしまい申し訳ございません。編集しておきます。 改めて行いたいことは (1)「大文字小文字の区別をしない」 例)テキストには「 difficult」があり、ユーザーが「DiffiCulT」と入力しても検索できるようにしたい。 (2)「英単語ごとに完全に一致する単語を検索したい」 例)テキストには「 Big dog」があり、文字の大小区別せずユーザーが「big」か「dog」を入力すると検索できるようにしたい (3)「ユーザーの複数入力した文字の先頭だけで検索したい」 例)テキストには「 I want to have a dog」があり、ユーザーが「want to」を入力しても「want」で検索したい の3つをユーザー入力による検索で行いたいです。 現在はユーザーが入力した文字が入った$inputを以下のように記載しているので、(1)が出来ています! if (preg_match_all("/$input/i", $text)) お送り頂いたマニュアルのエスケープシーケンス を読む限り、$input に対して(1)-(3)を満たすことが出来ないように思えるのですが、CHERRY様はどうお考えでしょうか。 アドバイスやコードの書き方等ございましたらご教授頂きたいです。 また、長文失礼致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問