• 締切済み

2つの正規表現の違いは?

次の正規表現を使った置換の違いがよく分かりません。 $strString="abcd<!--s_1-->うほほ<!--e_1-->efg"; echo preg_replace("/<!--s_1-->.*<!--e_1-->/","<!--s_1-->なんと<!--e_1-->",$strString); $strString="abcd<!--s_1-->うほほ<!--e_1-->efg"; echo preg_replace("/<!--s_1-->.*?<!--e_1-->/","<!--s_1-->なんと<!--e_1-->",$strString); .*  と .*? なんですが、どういったところで違いがでるのでしょうか?

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

みんなの回答

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.3

>これなら違いが分かりました。直前のパターンの0回以上の繰り返しですね。 違います。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

> これなら違いが分かりました。直前のパターンの0回以上の繰り返しですね。 こっちじゃないかしら。 *? -> not greedily. http://perldoc.perl.org/perlre.html

参考URL:
http://www.google.co.jp/search?hl=ja&q=%27*%3F%27+%E6%9C%80%E7%9F%AD%E4%B8%80%E8%87%B4&lr=lang_ja
dv8hjkwf
質問者

お礼

最短一致記号ということになるのでしょうか。もっとも近い距離にあるものだけを対象にするという…。

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

その例だと違いはわからないかと。 $strString="abcd<!--s_1-->うほほ<!--e_1--><!--s_1-->うほほ<!--e_1-->efg"; これだと分かるかと思います。

dv8hjkwf
質問者

お礼

これなら違いが分かりました。直前のパターンの0回以上の繰り返しですね。 正規表現は、いつもつまづいてしまいます。

関連するQ&A

  • 文字列の置換の仕方について

    下記のような文字列の置換は、どのようにすればいいでしょうか? <?php $strString="abcd<!--s_1-->うほほ<!--e_1-->efg";//本当は、もっと長い文字列が入っています $strReplace="/<!--s_1-->.*<!--e_1-->/"; $word="あいう"; //関数へ飛ばします $result=fun_replace($strReplace,$strString,$word); function fun_replace($strReplace,$strString,$word){ //さて、どう組むか? } ?> 結果として、"abcd<!--s_1-->うほほ<!--e_1-->efg" → "abcd<!--s_1-->あいう<!--e_1-->efg" になればいいわけです。 ただし、常に、<!--s_1-->が来るとは限らないので、 (<!--s_2-->などが来ることもあります) "<!--s_1-->"."あいう"."<!--e_1-->" というような、<!--s_1-->などを明示的に指定して、文字列を 連結することはできません。 つまり、 preg_replace($strReplace,"<!--s_1-->なんと<!--e_1-->",$strString) という書き方は、できないという条件があります。

    • ベストアンサー
    • PHP
  • grepの正規表現での最短マッチが効かない

    echo 'abcd_efg_hijk_l_m_n_opqr' | grep -o -E "^[a-z].+?_" 上記の結果が、期待する abcd_ になりません。 なぜか、 abcd_efg_hijk_l_m_n_ になります。 egrepでも同じでした。 phpでのpreg系ではabcd_をマッチ結果として返してきます。 linuxのgrepでこのような結果になるのはなぜですか? よろしくお願いします。

  • 正規表現

    正規表現に疎いので質問させてください。 $param = ereg_replace('/?$', '', $_SERVER['REQUEST_URI']); これをpreg_matchで書くとどうなりますか? よろしくお願い致します。

    • 締切済み
    • PHP
  • 【PHP】preg_replace() で正規表現が正常に動かない?

    PHP5利用者です。 preg_replace() が思い通りに動かないため困っています。 マルチバイト文字及び正規表現を使おうとした場合動作がおかしいのです。例えば、 「 . 」は任意の1文字とされていますが、 $str = preg_replace("/第.回/", "第3回", "今日は第*回目です。"); 等と書いても何も置換されません。 これは一体どういうことなのでしょうか? 文字コードはUTF-8です。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • スラッシュの正規表現(置換)

    php初心者で更に正規表現(置換)が特に苦手なので、教えてください。 例えば下記のurlで http://www.goo.ne.jp/ を一番後ろの"/(スラッシュ)"だけとって、 http://www.goo.ne.jp にするにはどうしたら宜しいでしょうか? ちなみに、 http://www.goo.ne.jp/test のような場合は、何もしない事も出来るのでしょうか? いまいち方法が分からず、こんな感じで行ったのですが、 $url = preg_replace("\///", "\\1",$url); エラーが出てしまいます。

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

    お世話になります。 ereg_replace で書いた正規表現による置換処理を、 preg_replace に置き換えようとしています。 (preg_replaceの方が処理が速いとマニュアルにあったので) ところが、preg_replaceでの正規表現検索がうまくいかないで困っています。 基本的には、ereg_replaceの正規表現部分を//で囲んでいるだけです。 具体的には、下記のような処理を書いています。 間違いがあれば、ご指摘いただけましたら幸いです。 //### うまくいっている ereg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='\{dokuji tag\}.+\{_dokuji tag\}'; $replace=''; $html=ereg_replace($search,$replace,$html); //不要部分の削除 //### うまくいっている ereg_replace のパターン ここまで ### ↓ //### うまくいかない preg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='/\{dokuji tag\}.+\{_dokuji tag\}/m'; $replace=''; $html=preg_replace($search,$replace,$html); //不要部分の削除 //### うまくいかない preg_replace のパターン ここまで ### //### 置き換えるソース('template/temple.html') ここから ### <!-- {dokuji tag} --> <tr> <td nowrap><strong>タイトル:</strong></td> <td> <input type="text" name="name" size="80" value="{name}" /> </td> </tr> <!-- {_dokuji tag} --> //### 置き換えるソース('template/temple.html') ここまで ### よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 正規表現の読み方

    /{(.+?)}/e この正規表現はどのような意味でしょうか? 下記のようなプログラム(テンプレートエンジン)に使われています display('index.html', $prm); function display($tpl, $prm) { $html = file_get_contents($tpl); $html = preg_replace('/{(.+?)}/e', '$prm[\'$1\']', $html); echo $html; }

    • ベストアンサー
    • PHP
  • preg_replaceの正規表現を教えて下さい。

    preg_replaceの正規表現を教えて下さい。 元:'あいうえお<meta content=\"text/html; charset=Shift_JIS" />かきくけこ' 後:'あいうえお<meta content=\"text/html; charset=utf-8" />かきくけこ' というように、charset= に続く部分を preg_replaceで置換したいのですが、スキル不足でできません。 $a = 'あいうえお<meta content=\"text/html; charset=Shift_JIS" />かきくけこ'; $p = "/<meta.*charset=([^\"']+)[^>]/i"; $x = preg_replace( $p, "utf-8", $a ); とやってみましたが、$xには、全く期待通りの結果は得られませんでした。 この置換を実現できる正規表現を教えて下さい。

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

    正規表現について教えて下さい $string = "LibrayMyUtil2File AppFile"; $pattern = '/([A-Z][a-z0-9]*)*([A-Z][a-z0-9]*)File/'; $replacement = '$2'; echo preg_replace($pattern, $replacement, $string);//Util2 App と表示される この例のように、「File」の前の単語に置き換えたいのですが、 このやり方だとpatternの「[A-Z][a-z0-9]*」が重複しているのが凡長だと思ってまして もっと短縮された書き方があれば教えてもらいたいです。

    • ベストアンサー
    • PHP
  • 正規表現について教えてください

    これから正規表現を勉強しようとする者です。 次の2点について教えて頂きたいのですが、よろしくお願いします。 1.次のような置換をする正規表現は? 例えば、 ■■■ あいうえお かきくけこ ■■↓ ○○○ あいうえお かきくけこ ○○○ というテキストがある場合、○○○~○○○までの「あいうえお」 のみを「アイウエオ」に置換するには、どのような正規表現にすれば 良いのでしょうか? 2.秀丸エディタでは、フォルダ内の全ファイルを一括で置換する 事はできるのでしょうか? 以上2点です。 よろしくお願いします。