• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPにおける正規表現について)

PHPにおける正規表現の活用方法

このQ&Aのポイント
  • PHPにおける正規表現を使って複数行の文字列から特定のパターンを検索する方法について教えてください。
  • 対象の文字列が複数行にわたっている場合でも、改行文字を削除することなく検索する方法を教えてください。
  • 正規表現の修飾子「s」や「m」を使っても一致させることができない場合、どのように対処すれば良いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.2

今後も需要ありそうなのでQiitaに分かりやすくまとめました。 http://qiita.com/mpyw/items/8dd5378cb01c877e1f7b >> 【地球連合軍】というキーワードを実行時にユーザー入力など動的に変化する文字列から一致させたい 一度空白文字を全て $text = preg_replace('/[\\s ]++/u', $text); ※全角スペースを文字クラスに入れているのでu修飾子が必須です などとして全て取り去ってしまうのが一番賢いかもしれません。 一応下記のように動的に正規表現を作ることも出来なくも無いですが・・・ $keyword = '地球連合軍'; $chars = preg_split('//u', $keyword, -1, PREG_SPLIT_NO_EMPTY); $quoted_chars = array_map(function ($i) { return preg_quote($i, '/');}, $chars); $pattern = '/' . implode('\\s*+', $quoted_chars) . '/'; ※マルチバイト文字列として分解するため、preg_splitではu修飾子が必須です ※この場合、$patternではu修飾子は不要です >> アスタリスクの後の+についてがちょっとわかりません。 Qiitaの記事を読んでもらえれば分かると思います。 >> 「\\」について、エスケープ不要である場合もある、・・・ まさにそういうことです! (正直PHP言語のこの実装気持ち悪いのであんまり好きじゃない) >> 本来PHPにおいて【¥s】というエスケープ文字は存在しませんよね ご指摘ありがとうございます・・・ どこで間違えたのやら、1年ぐらいずっと勘違いし続けていました・・・ \x20と間違えていたのかな・・・ (過去の回答訂正できるなら訂正したい) 心からご指摘感謝します m(_ _)m >> PHPは正規表現そのものを文字列で書くため はい、その認識で誤りはありません。 (\sが幻だったのが衝撃すぎて・・・ry

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

「改行」だけマッチしたいなら\nやら\rをチェックした方がよいでしょう また改行を一つまで許すのか複数でもいいのかによっても若干書き方がちがいます <?PHP $data = <<< EOF ABXYCDX YEFX YGHX YIJ EOF; $pattern="/X(?:\r\n|\r|\n){0,1}Y/s"; preg_match_all($pattern,$data,$matches); print_r($matches); ?>

noname#244856
noname#244856
回答No.3

一部訂正 $keyword = '地球連合軍'; $chars = preg_split('//u', $keyword, -1, PREG_SPLIT_NO_EMPTY); $quoted_chars = array_map(function ($i) { return preg_quote($i, '/');}, $chars); $pattern = '/' . implode('[\\s ]*+', $quoted_chars) . '/u'; こっちのほうがいいかも。

noname#244856
noname#244856
回答No.1

$hoge = preg_match('/E\\s*+F/', $data, $matches); 一応こういうことも意識しておいてください。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10110102910 http://okwave.jp/qa/q8199171.html

1000vicki
質問者

補足

ご回答ありがとうございます。 ご回答の様に、 たとえば、【地球連合軍】というキーワードを実行時にユーザー入力など動的に変化する文字列から一致させたいときは $hoge = preg_match('/地\\s*+球\\s*+連\\s*+合\\s*+軍/', $data, $matches); と、 [[どの文字のあとでも改行や空白があってもよい前提で正規表現をかかなきゃいけない]] んですね。 >>$hoge = preg_match('/E\\s*+F/', $data, $matches); とありますが、 【\\s*+】 上記、正規表現についてですが、このバックスラッシュ二つにはついては後に回すとして アスタリスクの後の+についてがちょっとわかりません。 これは正規表現上の空白類文字を表す【¥s】が0回以上【*】が一回以上【+】出現するという意味でよいでしょうか? また http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10110102910 上記URLの >><個人的なお願い> 「\\」について、エスケープ不要である場合もある、 とありますがこれは例えば、 $toDay = "今日は、コンビニで¥3500円支払いました"; といった文字列を扱う場合、通常【¥3】というバックスラッシュのあと全角数字3に該当するエスケープ文字が 存在しない場合、事実上、バックスラッシュがそのまま¥と表記させる事例のことですよね? (※本来バックスラッシュ後0~7の半角数字がくると8進数形式のアスキー文字のようですが) 次に、 掲題の回答にありました 【\\s*+】 の部分ですが、 本来PHPにおいて【¥s】というエスケープ文字は存在しませんよね PHPマニュアルにおいても存在しないようですし、 実際にPHPのインタープリタで確認してみると >>> echo "文字列¥sテスト"; とうっても 出力されるものは #=> 文字列¥sテスト と表示されますが・・・。 上記と同様に http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10110102910のページに記載している >><個人的なお願い> >>「PHPのためのエスケープ」と「正規表現エンジンのためのエスケープ」の両方を行う必要があります。 つまり「\」という文字自体を正規表現でマッチさせたければ「\\\\」とする必要があるのです。 とありますが、これはPHPのマニュアルにもどこかに記載があったとおもったのですが PHPは正規表現そのものを文字列で書くため 「PHPのためのエスケープ」これはPHPの文字列としての【¥¥¥¥】がエスケープシーケンスされて【¥¥】という文字が 「正規表現エンジン」へわたるという意味ですよね?正規表現そのものは文字列なので【¥¥】はエスケープされて 【¥】となると。これはつまりは正規表現エンジン内でも文字列としてあつかっているということですかね? ....この辺はPHPのCレベルの実装みないと正確にはりかいできないのですかね。

関連するQ&A