• ベストアンサー

PHPの正規表現 パターン修飾子「U」の使い方

PHPの正規表現 パターン修飾子「U」の使い方について調べています。 どこのサイトを見ても、 「この修飾子を設定すると、量指定子の「貪欲さ」が反転します。 つまり、量指定子は、デフォルトで貪欲でなく、疑問符を後ろに付けてはじめて貪欲になるようになります。 この修飾子は Perl 互換では有りません。 同様の設定は、(?U) 修飾子をパターン内で設定 するか、(.*? のように)量指定子の後に疑問符を 付けるかすることで行うこともできます。 」 と、あからさまにマニュアルからコピーしたものをただ載せているサイトばかりでした。 量指定子の「貪欲さ」って何!?この説明文を(コピーして)載せた人間は意味わかってるのか!?って言う具合です。 パターン修飾子「U」の使い方を自然な日本語で、できれば簡単な例も載せていただいて説明していただけるとありがたいです。

  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

*、+、? という正規表現のメタ文字は、可能な限り長いマッチを行おうと努力します(貪欲。というのはそういう意味)。 一方、 *?、+?, ?? というメタ文字は可能な限り短いマッチで済まそうと努力します(lazy ものぐさ)。 U修飾子はこの意味を逆転させるということです。 つまり、 長いマッチをさせたいなら *?, +?, ?? のように書き、 逆にものぐさなマッチをさせたいのなら *, +, ? と書けということになります。 貪欲だとかものぐさなものの違いがわかりやすいのはたとえば '<a href="...">....</a>' という文字列から '<' と '>' に挟まれた部分を取り出したいというときに<.*> と書いたとして「貪欲」なほうだと  <a href="...">....</a> と、とちゅうの '>' も飲み込んで最後の'>'までマッチさせてしまいますが、 ものぐさなほうでは途中の'>' の時点で満足してしまうので <a href="..."> がマッチの結果になります。 と、こんな説明でいかがでしょうか?

gakkacho3
質問者

お礼

ご回答ありがとうございます。 とても分かりやすい説明で、助かりました! そういうことだったんですね。 実例も明快で理解しやすかったです。

その他の回答 (2)

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.3

もう解決しちゃってるようなんで、他の分部の補足。 >と、あからさまにマニュアルからコピーしたものをただ載せているサイトばかりでした。 >量指定子の「貪欲さ」って何!?この説明文を(コピーして)載せた人間は意味わかってるのか!?って言う具合です。 phpの公式サイトにあるリファレンスと全く同じものがあるサイトは、たんにミラーサイトなだけで、作者が意図的に丸ごとコピーして載せているって意味じゃないですよ。

gakkacho3
質問者

お礼

補足回答ありがとうございます。 「php preg_match パターン修飾子 U 使い方」でググって見ると、そのphpマニュアルと同じことが書いてあるサイトばかりで、本当の使い方が書いてあるサイトは1つしかありませんでした。 みんなコピーサイトですか・・・・。 使いたい機能の説明ってなかなか書いてないですね。

回答No.1

そのままの意味で量指定子(+や*)が後ろに「?」をつけないと動作しなくなる、ということではないでしょうか。 以下のプログラムで試してみました。 <?php $subject = "aabbaaacc"; $pattern = "/a/"; if(preg_match_all($pattern,$subject,$matches)){ print_r($matches); } ?> $pattern = "/a/"; の場合 [0] => a [1] => a [2] => a [3] => a [4] => a $pattern = "/a+/"; の場合 [0] => aa [1] => aaa $pattern = "/a/U"; の場合 [0] => a [1] => a [2] => a [3] => a [4] => a $pattern = "/a+/U"; の場合("/a/"と同じ結果になる) [0] => a [1] => a [2] => a [3] => a [4] => a $pattern = "/a+?/U"; の場合 [0] => aa [1] => aaa 説明通り、後ろに?をつけないと+が働かなくなるようです。 ところで何のためにこのパターン修飾子について調べているのでしょうか?

gakkacho3
質問者

お礼

回答ありがとうございます。 どうやら、?をつけたときの挙動が逆転するらしいです。 メールの土台テキストを使用して、メールを送るサイトを作っているのですが、その方法を調べていたらこの方法が出てきました。 確かに送信はできたのですが、どういう仕組みなのかな・・・と思いまして。

関連するQ&A

  • perlの正規表現で量指定子を繰り返す意味

    perlの正規表現で量指定子を繰り返す意味 とあるブログのプラグインのコードを読んでいて不思議に 思ったことがあります。 .* このような正規表現は良く見るのですが、 .*? というような表現を見て不思議に思っています。 この場合、まず「.」で改行以外の一文字が、「*」0個以上ある、 その後の「?」によって「0個または1個」となると思いますが、 これだと「*」の意味がないように思います。 こういった量指定子を繰り返すことにどういう意味があるのか 最初から「.?」ではなぜいけないのか、教えていただけませんか。

  • Wz Editor5.0の検索式の正規表現はperlのとは違う?

    Wz Editor5.0の検索式で正規表現を使おうとしましたが、うまく動いてくれませんでした。別のエディターでは動いたのに、うまく動作しないということはperlのとは違うのでしょうか?設定のところでVWXW互換のところもいじってみましたが、結果は同じでした。 ちなみに入力した式は\w{51664}です。空白以外の文字のカーソルを置いた位置から51664番目までを指定、という意味です。 アドバイスをよろしくおねがいします。

  • DVM-RXH16U2の互換性

    こんばんは。 BAFFALO製の外付けDVDデバイスDVM-RXH16U2は、ほぼ全てライティングソフトとの互換性というのはあるのでしょうか?たまに互換性が生じてエラーが発生すると聞いたのですが…。 実はこのようにDVDのコピーを行うのが初めてなのでアドバイスいただけると嬉しいです。 下記にて質問して、色々と調べた結果、少々スペックの違う製品にしました。そうしたらこの疑問が生じたので質問した次第です。 よろしくお願いします。

  • 正規表現パターンの記入方法について

    とあるサイトで、 「URL からドメイン名を得る」という項目があったのでマネして やってみたらうまくいきました。しかし正規表現パターンの意味は 理解できませんでしたので理解できなかった部分だけをのせたスクリプトを以下にまとめました。 <?php // まずUPLからホスト名を得る preg_match('@^(?:http://)?([^/]+)@i', "http://www.nantoka.com/index.html", $matches); $zenbu=$matches[0]; $host = $matches[1]; $saigo=$matches[2]; /*必要なのはホスト名だけですが、$matches[0]や$matches[2]には どんな文字列が格納されるか気になって出力することにしました*/ print($zenbu); print("<br/>"); print($host); print("<br/>"); print($saigo); print("<br/>"); ?> これを実行した結果は、 $zenbuが「http://www.nantoka.com」で、 $hostが「www.nantoka.com」で、 $saigoがなにもなしでした。 このスクリプトでわからない部分は、'@^(?:http://)?([^/]+)@i'の部分と、$host = $matches[1];の部分です。 まず正規表現パターンの最初のアットマークの後ろの^は「次の文字列からはじまる」と解釈しました。 最後のアットマークの後ろのiは、「大文字と小文字を区別しない」という意味だと解釈しました。 カッコで囲まれている(?:http://)と、([^/]+)は、サブマッチパターン だと思いました。 $matches[0]には、"http://www.nantoka.com/index.html"の 中で'@^(?:http://)?([^/]+)@i'に当てはまるもの全体が格納され、 $matches[1]には、(?:http://)に当てはまるもの、 $matches[2]には、([^/]+)に当てはまるものが格納されると考えました。 [^/]+は、「スラッシュを含まない文字が1文字以上」と解釈しました。 ただ、その他の事については考えましたがよくわからず、 特になんで(?:http://)にあたるものが「www.nantoka.com」 になるのかさっぱりわかりません。 (?:http://)の中にあるhttp://の前の?:が一体何なのか、 (?:http://)と([^/]+)の間にある?は何なのか、 両端のアットマークは何なのか(マッチ演算子かと思って スラッシュに置き換えて実行してみたらエラーになりました。) うまく説明できませんがとにかくその辺のことがよくわかりませんでした。どなたか教えていただけませんか。

    • 締切済み
    • PHP
  • 正規表現にて、複数の単語を指定する方法

    質問タイトルが意味不明だったらすみません。 当方、Perlが何であるかも知らないド素人です(^^U どなたか正規表現の書き方をお教えくださいませ。   現在わたくしは、海外在住の友人がPCのセキュリティを怠っていた事が原因で、 海外から一日に数十通届いてしまうスパムメールに頭を悩ませております。 わたくしが使っているプロバイダー『WAKWAK』では、迷惑メールのブロック機能はあるのですが、 件名に含まれている単語もしくはアドレスを指定してブロックするという、ごく基本的な設定は簡単にできるものの、 それ以上細かい指定になると正規表現で記述しなければいけないという、素人には非常にキビシイものになっており、困り果てております。 そこで、どなたか --------------------------------------------------------------------------------- アドレスの最後が『.com』となっているもののうち、 友人が使っている『~hotmail.com』や『~yahoo.com』(や、その他いくつかのドメイン) 以外をブロックするための記述 --------------------------------------------------------------------------------- を教えて頂けませんでしょうか? ちなみに、WAKWAKのメールブロックの指定方法は、 まず"from" "Received" "Return-path"などの、どの部分にかかるのかを指定してから 正規表現を記入するようになっています。 (※参考URL(設定方法画面)はhttp://www.wakwak.com/info/mail/guide_mail.html です。) お時間のある時にどうぞよろしくお願い申し上げます。

    • ベストアンサー
    • Perl
  • 【Fantom-0】SMFパターン取り込みについて

    下記の内容で質問があります。 ▼Fantom-07 ▼SMFファイルの取り込みトラック、パターンの位置指定について ▼DAWで書き出した16小節程度のSMFファイルを取り込んでいるのですが、 リファレンスマニュアルのP130の SMFをパターンとして取り込む(IMPORT) 3.[E6]IMPORTを選びます この中の [E3]Destination インポート先のトラックを設定します とありますが設定できるのはトラック(1〜16)ではなくパターン(A〜H)の位置だけです。 この状態で読み込むとトラック1のパターン(A〜H)にしか読み込めないのでコピー、ペーストで本来入れたいトラックとパターンの位置に移しています。 そこでこのトラック(1〜16)の変更はどのようにしたら設定できるでしょうか? 教えていただけると助かります。 よろしくお願いいたします。 ※OKWAVEより補足:「電子楽器メーカーローランド製品、ボス製品」についての質問です。

  • ジャズギターのコードソロのパターン

    ジャズギターを練習している者です。 単音のメロディ主体のソロはある程度コードに沿ってとれるのですが、コードソロが苦手です。 知り合いに、コードワークの定番の動きのパターンを少し教えてもらったのですが、他にもこういったパターンをたくさん覚えなければソロになりません。 ウエスやジョー・パスをコピーしようとするものの、ほとんどコピーできません。コピーできてもそれがどのような脈絡にそってプレイされているのか全く分からないのです。 知り合いに教えてもらったパターンは、理論的なことも含めて説明してくれたのでしっかり身についたのですが、こういう具合にコードソロをパターン&解説入りで紹介している教材、サイトはありませんでしょうか? いちおう布川俊樹さんの、「ジャズ・ギター虎の穴 コード・ソロ完全征服への道」のDVDは買いました。 ただ自分には少し難しすぎるようです。早口でどんどん進んでいってしまうので何がなんだかよく解りませんでした。 もう少しパターンのバリエーションを、しっかり解説を読みながら理解して行きたいと思います。そういう教材をご存知でしたらぜひ教えてください。 よろしくお願いします。

  • 正規表現のパターン " [^<]*?>"

    正規表現のパターンの " [^<]*?>" これはどういう意味なのでしょうか?

  • 正規表現のパターン

    <value:type>1</value:stype> <item:img url="http://hoge/"></item:img> <description>hogehoge hogehoge </description> みたいなXMLの「value:」と「item:」を「」に置換(消す)して、「description」の改行文字を削除したいのですが、どのようなパターンになるのでしょうか?

  • この正規表現のパターンについて

    この正規表現のパターンについての意味を教えてほしい。 【疑問】 $pattern ="/((?:.*?<p>.*?<\/p>){3}).*/mis"; ↓の中の (?:.*?<p>.*?<\/p>){3} ↓の中の 先頭の「 ( 」の次の、「 ?: 」の意味がわかりません。 これは、どのような意味があるのでしょうか? 【今までの流れ】 あることが知りたくて質問しました。 そのページは、こちら http://okwave.jp/qa/q7300031.html 教えていただいた、正規表現で、「出来た、出来た」と喜んで、ベストアンサーとして質問を締め切りました。 正規表現って、言語などの環境により、多少の違いがありますよね? そこで、phpの正規表現を勉強しようと、その正規表現を見ました。 しかし、なぜ、これらの文字があるのかわかりません。 よろしくお願いします。

    • ベストアンサー
    • PHP