プロが教える店舗&オフィスのセキュリティ対策術

PHPの正規表現 パターン修飾子「U」の使い方について調べています。

どこのサイトを見ても、

「この修飾子を設定すると、量指定子の「貪欲さ」が反転します。 つまり、量指定子は、デフォルトで貪欲でなく、疑問符を後ろに付けてはじめて貪欲になるようになります。 この修飾子は Perl 互換では有りません。 同様の設定は、(?U) 修飾子をパターン内で設定 するか、(.*? のように)量指定子の後に疑問符を 付けるかすることで行うこともできます。 」

と、あからさまにマニュアルからコピーしたものをただ載せているサイトばかりでした。
量指定子の「貪欲さ」って何!?この説明文を(コピーして)載せた人間は意味わかってるのか!?って言う具合です。

パターン修飾子「U」の使い方を自然な日本語で、できれば簡単な例も載せていただいて説明していただけるとありがたいです。

A 回答 (3件)

*、+、? という正規表現のメタ文字は、可能な限り長いマッチを行おうと努力します(貪欲。

というのはそういう意味)。
一方、
*?、+?, ?? というメタ文字は可能な限り短いマッチで済まそうと努力します(lazy ものぐさ)。

U修飾子はこの意味を逆転させるということです。
つまり、
長いマッチをさせたいなら *?, +?, ?? のように書き、
逆にものぐさなマッチをさせたいのなら *, +, ? と書けということになります。

貪欲だとかものぐさなものの違いがわかりやすいのはたとえば

'<a href="...">....</a>'

という文字列から '<' と '>' に挟まれた部分を取り出したいというときに<.*> と書いたとして「貪欲」なほうだと 

<a href="...">....</a>
と、とちゅうの '>' も飲み込んで最後の'>'までマッチさせてしまいますが、
ものぐさなほうでは途中の'>' の時点で満足してしまうので
<a href="...">
がマッチの結果になります。

と、こんな説明でいかがでしょうか?
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2009/03/14 21:12

もう解決しちゃってるようなんで、他の分部の補足。



>と、あからさまにマニュアルからコピーしたものをただ載せているサイトばかりでした。
>量指定子の「貪欲さ」って何!?この説明文を(コピーして)載せた人間は意味わかってるのか!?って言う具合です。

phpの公式サイトにあるリファレンスと全く同じものがあるサイトは、たんにミラーサイトなだけで、作者が意図的に丸ごとコピーして載せているって意味じゃないですよ。
    • good
    • 0
この回答へのお礼

補足回答ありがとうございます。

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

お礼日時:2009/03/15 08:39

そのままの意味で量指定子(+や*)が後ろに「?」をつけないと動作しなくなる、ということではないでしょうか。


以下のプログラムで試してみました。

<?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

説明通り、後ろに?をつけないと+が働かなくなるようです。


ところで何のためにこのパターン修飾子について調べているのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
どうやら、?をつけたときの挙動が逆転するらしいです。

メールの土台テキストを使用して、メールを送るサイトを作っているのですが、その方法を調べていたらこの方法が出てきました。
確かに送信はできたのですが、どういう仕組みなのかな・・・と思いまして。

お礼日時:2009/03/14 21:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!