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

$a = (1001,xxxx,yyyy) とします。
先頭一桁の値を使いたいのですが、
$a = explode(',',$buffer);
preg_match("/(.)*/",$a[0],$match)とすると、
$a[1]の値は下一桁になります。
先頭一桁にするには、どうすれば良いのでしょうか?

A 回答 (5件)

/(.)?/ ---- 最短マッチ


/(.)*/ ---- 最長マッチ
ですから、先頭一桁を検索するなら、
No.1さんの回答のように
/^(.)/ か /(.)?/、 /(.).*/、 /(.)/ としないといけないでしょう。

この回答への補足

先頭一桁の検索は、/^(.)/ か /(.)?/、/(.).*/、/(.)/ですか。
ありがとうございます。

(.)*と(.)?と(.).*と(.).*? は、どのような意味なのでしょうか?
ちょっと違いますが、下記を実行すると
<?php
$var="Japan America France England";
if(preg_match("/\b([AIUEOaiueo]*)\b/",$var,$result)){
print_r($result);
print("<br>");
}else{
print(一致しませんでした。);
}
if(preg_match("/\b([AIUEOaiueo]?)\b/",$var,$result)){
print_r($result);
print("<br>");
}else{
print(一致しませんでした。);
}
if(preg_match("/\b([AIUEOaiueo].*)\b/",$var,$result)){
print_r($result);
print("<br>");
}else{
print(一致しませんでした。);
}
if(preg_match("/\b([AIUEOaiueo].*?)\b/",$var,$result)){
print_r($result);
print("<br>");
}else{
print(一致しませんでした。);
}
?>
結果は、
Array ( [0] => [1] => )
Array ( [0] => [1] => )
Array ( [0] => America France England [1] => America France England )
Array ( [0] => America [1] => America )
となりました。
(.)*は最長マッチ、(.)?は最短マッチだそうですが、何もセットされません。
ちょっとお手上げ状態になりました。
正規表現を覚えるのは、パターンでも覚えるのでしょうか?
それとも、こういうのも理解しないといけないでしょうか?

補足日時:2009/07/04 18:53
    • good
    • 0

if(preg_match("/\b([AIUEOaiueo]*)\b/",$var,$result))


if(preg_match("/\b([AIUEOaiueo]?)\b/",$var,$result))

こちらの件、
if(preg_match("/\b\b/",$var,$result))
でもマッチします。
境界を表すものを連続して表記してもマッチするようです。(境界を一文字とカウントしないから?)
ソレを踏まえた上で、「*」「?」ですが
「*」は0文字以上にマッチするわけなので、空になるのは分かると思います。
「?」に関してですが、「*?」「+?」とあるときは最短マッチですが
それ以外で「?」と記述した場合は、「直前の文字を0又は1回にマッチ」となります。
その為、後方参照される値には含まれないものと思います。
    • good
    • 0
この回答へのお礼

$var="Japan America France England";
if(preg_match("/\b([AIUEOaiueo]*)\b/",$var,$result))の結果が、
Array ( [0] => [1] => )
となるのは、()の中に量指定子が入っているわけで、
([AIUEOaiueo]*)で検索。
[AIUEOaiueo]が0回以上、つまり「空」を検索して、空がマッチ。$result[0]は「空」
([AIUEOaiueo]*)とグループ化しているので、$result[1]は「空」

if(preg_match("/\b([AIUEOaiueo].*)\b/",$var,$result)){ の結果は、
Array ( [0] => America France England [1] => America France England )
これは、[AIUEOaiueo]の任意の1文字で検索して、最長マッチ
([AIUEOaiueo].*)とグループ化しているので、$result[1]は、America France England

if(preg_match("/\b\b/",$var,$result))の結果は、
Array ( [0] => )
空で検索して、[0]は空
グループ化していないので、ここで検索終了。

/(.)?/は最短マッチ
/(.)*/は最長マッチという意味で、
「*?」「+?」も最短マッチ

$var = "abcd";
preg_match("/(.)*/", $var, $match);
$match[1]にdが入る
最後に検索された値が残る(上書きされる)
(.)を検索しているのではないでしょうか(..)
ありがとうございました。

お礼日時:2009/07/05 17:06

No.2です。


if(preg_match("/\b([AIUEOaiueo]*)\b/",$var,$result))
if(preg_match("/\b([AIUEOaiueo]?)\b/",$var,$result))
上記は等価で、いずれの「単語」にもマッチします。
結果 Array ( [0] => [1] => ) といことは 「空」が入っているということです。
したがって、量指定子の単なる「*」「?」はこの場合意味が無いです。
場合によって、*?、(..)?、(..)*?、とすると違う意味になります。

この回答への補足

いずれの「単語」にもマッチするのに、なぜ結果が「空」なのでしょうか?
意味が無いから、結果が空になったのでしょうか?

補足日時:2009/07/05 09:58
    • good
    • 0
この回答へのお礼

回答ありがとうございます。<m(__)m>
指定の誤りということで、結果が「空」なのでしょうか

お礼日時:2009/07/05 10:02

あまり自身はないですが・・・・



$var = "abcd";

preg_match("/(.)*/", $var, $match);

これの結果が、$match[1]にdが入るという件、

「.」は任意の一文字をさし、任意の一文字だけをグルーピングしている
グルーピングの外側で「*」を指定しているので
「a」が検索され、「b」が検索され、「c」が検索されて、「d」が検索される。
ただしグルーピングされる内容は一文字だけになるため、最後に検索された値が残る(上書きされる)
というものなのだと、「思われます」。

結果から見る予測なので、実際はどうなっているのかは分かりません。

この回答への補足

回答ありがとうございます。おっしゃっていることはあっているような感じがします。#2の補足で、また質問しました。正規表現は難しいですね。(^_^;)

補足日時:2009/07/04 19:00
    • good
    • 0

先頭の文字を取得するには、


preg_match('/^(.)/', $a[0], $match)
とすれば良いと思います。
「^」が先頭であることを示します。
また、「$」を最後に入れると、そこが文末です。

この回答への補足

ありがとうございます。ところで、
preg_match("/(.)*/",$a[0],$match)
は、なぜ下一桁を取得したのでしょうか、
「.」任意の一桁
「*」0回以上の繰り返し
で$a[0]は"1001"となりますが、
次はその中の(.)を検索すると思うのですが、
数字とみなして、右から検索したのでしょうか?

補足日時:2009/07/04 07:16
    • good
    • 0
この回答へのお礼

すいません。
$a = (1aaa,xxxx,yyyy)
$a = explode(',',$buffer);
preg_match("/(.)*/",$a[0],$match)と、
"1aaa"で実行すると$a[1]は"a"でした。

"Japan America France England"の検索で
/([AIUaiu].*?)([EOeo].*?)/の場合
preg_matchで値を取得した場合
[0]"America"
[1]"Am"
[2]"erica"
と取得されています。この場合は左から検索しています。
なぜ下1桁を取得したのでしょうか?

お礼日時:2009/07/04 12:14

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