• ベストアンサー

正規表現 先頭一桁をマッチさせるには

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

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

  • ベストアンサー
  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

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

peiee
質問者

補足

先頭一桁の検索は、/^(.)/ か /(.)?/、/(.).*/、/(.)/ですか。 ありがとうございます。 (.)*と(.)?と(.).*と(.).*? は、どのような意味なのでしょうか? ちょっと違いますが、下記を実行すると <?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 ) となりました。 (.)*は最長マッチ、(.)?は最短マッチだそうですが、何もセットされません。 ちょっとお手上げ状態になりました。 正規表現を覚えるのは、パターンでも覚えるのでしょうか? それとも、こういうのも理解しないといけないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

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回にマッチ」となります。 その為、後方参照される値には含まれないものと思います。

peiee
質問者

お礼

$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が入る 最後に検索された値が残る(上書きされる) (.)を検索しているのではないでしょうか(..) ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.4

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

peiee
質問者

お礼

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

peiee
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

あまり自身はないですが・・・・ $var = "abcd"; preg_match("/(.)*/", $var, $match); これの結果が、$match[1]にdが入るという件、 「.」は任意の一文字をさし、任意の一文字だけをグルーピングしている グルーピングの外側で「*」を指定しているので 「a」が検索され、「b」が検索され、「c」が検索されて、「d」が検索される。 ただしグルーピングされる内容は一文字だけになるため、最後に検索された値が残る(上書きされる) というものなのだと、「思われます」。 結果から見る予測なので、実際はどうなっているのかは分かりません。

peiee
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

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

peiee
質問者

お礼

すいません。 $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桁を取得したのでしょうか?

peiee
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 日付をすべて2桁(07/02、 06/30)にしたい

    a.html内にある日付のデーターを取ってきて日付をすべて2桁(もし 7/2 ならば 07/02 、6/30 ならば 06/30)にしたいのですが、なかなかうまくいきません。 自分で作ったプログラムa.phpでは最初の日付しか2桁になりませんでした。 -------------a.html--------------- <>06/25、7/2<>13:00~13:55<>あああああ<> <>06/25、8/2<>19:00~20:00<>いいいいい<> <>6/27<>19:00~21:48<>ううううううう<> <>06/27、7/3、7/4、7/12<>19:58~20:54<>ええええええええ<> <>7/1<>13:54~17:00<>おおおおおおお<> --------------a.php---------------- <? $filename = "a.html"; $filedata = @file($filename); $filedata = @join("",$filedata); preg_match_all('/(<>(.*?)<>.*<>.*<>)/',$filedata, $match); for($i=0;$i<count($match[0]);$i++){ $match[2][$i] = explode("、", $match[2][$i]); //////////この辺がうまくできない/////// for($m=0;$m<count($match[2][$i]);$m++){ $match[2][$i][$m] = explode("/", $match[2][$i][$m]); $match[2][$i][$m][0] = sprintf("%02d", $match[2][$i][$m][0]); $match[2][$i][$m][1] = sprintf("%02d", $match[2][$i][$m][1]); $match[2][$i][$m] = $match[2][$i][$m][0]."/".$match[2][$i][$m][1]; $match[2][$i] = join("、",$match[2][$i]); } print $match[2][$i]."<br>";//←最後はこの形で表示できるようにしてもらいたいです// } ?> どなたか教えてください。m(_ _)m よろしくお願いします。

    • ベストアンサー
    • PHP
  • += -= *= /= を判別する正規表現

    PHP5.2.4を使用しています。 $key = 'a +='; $val = 2; の場合に、 a = a + 2 となるように変換するためには preg_match(ここに何か記述, $key, $match)を使ってどのように記述すれば良いのでしょうか? 例えば、次の条件だったら $key = 'a -='; $val = 2; a = a - 2 と変換したいです。 if (preg_match(ここに何か記述, $key, $match)) {  ここで$keyと$valと$matchを使って  a = a (+ or - or * or /) 2となるように記述すると思うのですが }

    • ベストアンサー
    • PHP
  • PHP 複数行の正規表現

    複数行にわたる正規表現についてです。 mオプションを使うとありますが、うまくいきません。 [改行が無い場合] $val=$pattern_url="/<a>(.*?)<\/a>/m"; preg_match_all($pattern_url,"<a>ABCD</a>",$match_url,PREG_SET_ORDER); だと 1 ABCD が出力されます。 [改行がある場合] $val=$pattern_url="/<a>(.*?)<\/a>/m"; preg_match_all($pattern_url, "<a>AB CD</a>", $match_url,PREG_SET_ORDER); 出力結果は 0 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現の文字化け?で困っています。

    preg_matchで、条件を変数で定義したいのですが、うまくいきません。 すみませんが、教えてください。 $str = "hoge.php?a=10&b=3"; から"a=10"をマッチさせる場合。 preg_match('/^(.*(\?|&))(a=.*)(&.*)*$/', $str); で、一応うまくいきます。 マッチ条件を状況により変更させるため、まずは、 $con = "'/^(.*(\?|&))(a=.*)(&.*)*$/'"; preg_match($con, $str); のようにしたいのですが、なぜかマッチしてくれません。 すみませんが、対策方法の分かる方がいらっしゃましたら、ご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • http://とhttps://のどちらでもマッチングできる正規表現

    http://とhttps://のどちらでもマッチングできる正規表現の書き方が分かりません。aタグの中のhref="のあとのURL部分にhttpでもhttpsのどちらでもOKのマッチングをかけたいです。 具体的にはhttp://www.aaa.co.jpでもhttps://www.aaa.co.jpのどちらでもpreg_match_allでマッチングをかけたいです。 $count=preg_match_all("正規表現",$URL,$maches); という感じでhttpかhttpsのURLに引っ掛けたいです。 教えてください

    • ベストアンサー
    • PHP
  • カンマ区切りの金額を検索するための、正規表現を教えてください

    PHP4を使っています。 表題のとおりなのですが、 カンマ区切りの金額を検索するための、正規表現を教えていただけないでしょうか? http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-3-14.html を参考に、 $pattern = '^(0|([1-9][0-9]{0,2}(,[0-9]{3}){0,2}))$'; if (preg_match("/$pattern/", $oneline_buffer, $matches)){ としているのですが、 なぜかpreg_matchにひっかかりません。 (preg_match の直前の行を通っていることは、確認済みです) どなたか、お助け願えれば幸いです。

    • ベストアンサー
    • PHP
  • 正規表現の書き方について

    $a=aaaaaaあああ1111いいい2222; 上記の$aを <br>aaaaa<br>aあああ<br>1111いいい<br>22222<br> このようにしたいのですが、 条件1:半角英数字の頭に<br> 条件2:半角英数字が5つ続いたら<br> としたいのですが、正規表現の記述方法で悩んでいます。 $b=preg_match([a-zA-Z0-9],$a)がに該当したら これで受け取ったものをpreg_replace<br>で挟む?のでしょうか。 そもそも条件は1つ以上指定できないのかもしれませんが・・・。 何かご存知の方いましたらご教授お願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現について

    人名を漢字、平仮名、アルファベットでカンマ区切りでcsvファイルに保存したものがあるとします。 それで例えば、平仮名で一番初めが「あ」の人だけを表示させたいプログラムを書きたいのですがなかなかうまくいきません。 正規表現の使い方もいまいちわかっていなく、とりあえず全て平仮名かどうか調べるプログラムを、 http://phpspot.net/php/pg%90%B3%8BK%95%5C%8C%BB%81F%82%B7%82%D7%82%C4%82%D0%82%E7%82%AA%82%C8%82%A9%82%C7%82%A4%82%A9%92%B2%82%D7%82%E9.html のサイトからコピーして作成してみたのですが、表示されませんでした。 以下が作成したものです。 <?php $handle = fopen("csv.csv", "r"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); list($kanji,$hiragana,$alphabet) = explode(",", $buffer); if(mb_ereg("^[あ-ん]+$",$hiragana)){ $output .= "$kanji<BR>\n"; } } } fclose($handle); echo $output; ?> もし出来ましたら、先頭が「あ」だけを表示する正規表現の表し方なども教えていただけると助かります。 お願いします。

    • ベストアンサー
    • PHP
  • 正規表現preg_match('#^(?:[a-z

    preg_match('#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i', $hoge)の意味を教えて ・#iなので、デリミタは#。大文字小文字は無視 ・先頭に、【「:(英数字ハイフンが1回以上).」が、0回または1回の出現】が1回以上の繰り返し ・続いて、英字が2回以上の繰り返し と思い、 :123a-.ss てやってみたのですが、0が返ってきました。 この正規表現の意味と、 この場合、どんな文字列が当てはまるか知りたいです

    • ベストアンサー
    • PHP
  • 正規表現 preg_match_all 

    $c = preg_match_all('@href="/Top/World/Japanese/(?P<query>.*?)">(?:<b>|)(?P<cate>.*?)(?:</b>|)</a>@s', $buf,$match,PREG_SET_ORDER); print_r($match); の(?:<b>|)と(?:</b>|)の部分がまちがっているので、<b></b>タグがあってもなくてもいい場合にマッチさせることができないと思っています。 どうか教えてくださいませ。 ちなみにPHPの5.2.2です。

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • 写真のスキャナーでの取り込みと印刷についてのお困りごとやトラブルの経緯、試したこと、エラーについて教えてください。
  • お使いのパソコンもしくはスマートフォンのOSや接続方法、Wi-Fiルーターの機種名、関連するソフト・アプリ、電話回線の種類について教えてください。
  • ブラザー製品に関する質問です。FAQのタイトルはAirPrintの使い方|ブラザーで、詳細な情報は以下のURLをご覧ください。
回答を見る