• ベストアンサー

正規表現preg_match('#^(?:[a-z

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

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数2
  • ありがとう数3

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

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

次のコードを実行してみてください。 <?php $hoge='123a-.sx'; print '<pre>'; if(preg_match('/^([a-z0-9\-]+\.){1,}([a-z]{2,})$/i', $hoge, $match)){print_r($match);}else{print "NoMach\n";} if(preg_match('/^(?:[a-z0-9\-]+\.){1,}([a-z]{2,})$/i', $hoge, $match)){print_r($match);}else{print "NoMach\n";} if(preg_match('/^([a-z0-9\-]+\.){1,}(?:[a-z]{2,})$/i', $hoge, $match)){print_r($match);}else{print "NoMach\n";} if(preg_match('/^(?:[a-z0-9\-]+\.){1,}(?:[a-z]{2,})$/i', $hoge, $match)){print_r($match);}else{print "NoMach\n";} if(preg_match('/^(:[a-z0-9\-]+\.){1,}([a-z]{2,})$/i', $hoge, $match)){print_r($match);}else{print "NoMach\n";} (?:PATTERN) は、基本的には(PATTERN)と同じですが、後方参照を作らないってことです。

re999
質問者

お礼

回答ありがとうございました。 質問自体の疑問を解決できただけでなく、preg_matchの第3引数の使い方も学べたので、大変参考になりました。 どこで参照できるか目で見て確認できるので、この引数は、とても便利だなと思いました。 これから活用していきたいと思いますー

その他の回答 (1)

回答No.1

失敗ケースを示すのに難航。説明って難しいなぁ… http://ideone.com/s9uc3

re999
質問者

お礼

回答ありがとうございました。 >括弧を使うと、グループにできる >(?: )の構文を使うと、そのような割り当てから外れる …知りませんでした。 「おまけ」のコメント、リンク先も、大変勉強になりましたー

関連するQ&A

  • 正規表現[a-z0-9\-\.]* の意味を教えて

    [a-z0-9\-\.]* の意味を教えてください。 preg_matchで確かめてみようと思ったのですが、 よく分かりませんでした。 「半角英小文字」か「数字」か「ハイフン」か「ドット」だと思ったのですが、 「半角英大文字」でも、「""」でも「空白」でも「日本語」でも、1が返ってきました。 「*」を調べたら、「直前の表現の0回以上の繰り返しにマッチ」て書いてあったのですが、 「0回以上」の意味が分かりません。 「すべてに当てはまる」ということなのでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現preg_replace("/[a-z0-

    「*」を調べたら、「直前の表現の0回以上の繰り返しにマッチ」て書いてあったのですが、 「0回以上」の意味が良く分かりません。 例えば、 preg_replace("/[a-z0-9\-\.]/", "○", "ABCabcXYZxyz");の実行結果が、 「ABC○○○XYZ○○○」となるのは分かるのですが、 preg_replace("/[a-z0-9\-\.]*/", "○", "ABCabcXYZxyz");の実行結果は、 どうして、「○A○B○C○○X○Y○Z○○」になるのでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現パターン'/^[a-z0-9]+$/iD' の最後の"D"について

    こんにちは。今PHPの勉強をしているものです。 勉強中、ctype_alnum()という関数がわからなかったのでPHPマニュアルで調べたら、「この関数は preg_match('/^[a-z0-9]+$/iD', $text) と等価です。」と書いてありましたが、英字または 数字であるかどうかを調べるのなら、パターンは'/^[a-z0-9]+$/i'だけでいいと思いますが、最後のDはいったいなんなのでしょうか?修飾子で調べて見ましたがDなどといったものは見当たりませんでした。どなたか教えていただけませんか。

    • ベストアンサー
    • PHP
  • PHPの正規表現「preg_match」で漢字を含む場合のマッチパター

    PHPの正規表現「preg_match」で漢字を含む場合のマッチパターンについて 宜しくお願い致します。 preg_matchを使っての正規表現で、「あいうえおかきくけこ3月10日さしすせそ」という文字列から「3月10日」だけを抽出するには、どういうパターンが良いのでしょうか? 下記の様にやってみましたが、だめでした。。。 preg_match("/\d{1,2}[月]\d{1,2}[日]/",$hoge,$match) これではうまくいきません。 どなたかお助けくださいー!

    • ベストアンサー
    • PHP
  • 正規表現 許可文字列 かつ 指定連続文字列の排除

    わかりにくいタイトルで恐縮です。 初歩的な問題かもしれませんが、もう何日も悩み続けており、ヒントでもいただけると助かります。 たとえば、 正規表現にて 英字のみ(1文字以上) という場合は preg_match("/[a-z]+/i",$string) という風にすればいいと思います。 ここで、英字のみ(1文字以上) しかし、abc という連続文字列があれば該当させない、という場合どういう正規表現を作ればいいのでしょうか? preg_match("/[a-z^(abc)]+/i",$string) みたいなヘンテコなものを作ってみたりしてみたのですが、文法違いなのか、やはり正常には動いてくれません。 ([^a][^b][^c]) なんていうのも違いますし。 狙いは、文字列の最初でも最後でも途中でも、指定文字以外や指定連続文字列がある場合は、エラーを出す、というようなものにしたいのです。 なにかヒントいただければと思います。

    • ベストアンサー
    • PHP
  • ['SERVER_NAME']と正規表現について

    下記の意味が分かりません。 ( !empty($_SERVER['SERVER_NAME']) && preg_match('#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i', $_SERVER['SERVER_NAME']) ) ? preg_replace('#^www\.#', '.', $_SERVER['SERVER_NAME']) : ''; <分かる範囲> $_SERVER['SERVER_NAME']が空ではなく、かつ、$_SERVER['SERVER_NAME']の中に'#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i'があったら、$_SERVER['SERVER_NAME']の中の'#^www\.#'を'.'へ置き換え <知りたいこと> 正規表現の所の意味と、結局、この一文で何をしようとしている(と予想される)か、教えてください

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

    PHP5.2.4を使用しています。 1文字以上のアルファベットと数字の組み合わせは許可(含めて) かつ 「ab」は許可しない(含めない) という正規表現はどのように記述すれば良いのでしょうか?(「01ab」「abc」は許可、「ab」は許可しない) 一応自分なりに考えてみたのですが、 $str = "abc"; if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { print "match<br>\n"; } やはり駄目でした・・・

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

    今現在、PHPの勉強をしているのですが preg_match("/\nFrom:\s*(.+)\r/i", $sss, $aaaa) という文字列が出てきて困っています。 preg_match関数における\nFrom:とは一体何なんでしょうか。教えてください。

    • 締切済み
    • PHP
  • 正規表現

    いつもお世話になっております。 早速質問させていただきます。 文字列中に {{○}} を検索し、マッチさせるための 正規表現を教えてください。 (中括弧×2 英数字 中括弧×2) ○には、英数字が入る可能性がございます。 {{○}} は複数個あるかもしれないので、preg_match_all() を 使用したほうがいいかと考えております。 よろしくご教示お願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現preg_matchでincrement?

    foreach($data as $key=>$val) { if(preg_match("/^increment\((\-?\d+)\)$/i",$val,$m)) $q.= "`$key` = `$key` + $m[1], "; ・上記のようなif文があるのですが、どういう意味でしょうか? ・incrementはカウントアップ? ・$valに「-1」…「-9」文字列があれば、$m[1]として利用? ・iがあるので、その際、大小文字の違いを無視?

    • ベストアンサー
    • PHP

専門家に質問してみよう