• ベストアンサー

正規表現の読み方

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

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

「 { と } に囲まれた } を含まない物」にマッチします。 で、{ と } に囲まれた中身が置換文字列の $1 で参照されて、$prm[] の添え字になります。 たとえば、対象文字列が {aaa} だったら、$prm['aaa'] の値と置換されます。 / /e の e は、置換文字列が、$prm['aaa'] という文字列でなくてその式で表される値になります。 $prm['bbb'] = 'foo'; echo preg_replace('/{(.+?)}/','$prm[\'$1\']', 'aaa{bbb}ccc'); #=> "aaa$prm['bbb']ccc" echo preg_replace('/{(.+?)}/e','$prm[\'$1\']', 'aaa{bbb}ccc'); #=> "aaafooccc"

その他の回答 (1)

回答No.2

? は最長の一致指定子なので、 大括弧に括られた任意の一文字の1回以上の出来るだけ少ない繰り返しという意味。 e が付いてるから、その文字列を式として評価するってことでしょ? '{1}{12}{123}' という文字列があったら、{1} を $prm[1] と置換、次に {12} と $prm[12]、最後に {123}、$prm[123] 。 違うかな~?

関連するQ&A

  • 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
  • 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
  • 正規表現について教えて下さい

    正規表現について教えて下さい $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
  • Smarty includeでテンプレートを読み込めない

    よろしくお願いします。 まずphpファイルから $smarty->display('111/body.tpl');(*111はディレクトリ名) を呼び出して、さらにbody.tplと同ディレクトリにあるcontents.tplを読み込もうとしています。 はじめのbody.tplは読み込むことができブラウザで表示されるのですが、contents.tplは読み込めず、 Warning: Smarty error: unable to read resource: "contents.tpl" in <絶対パス>/Smarty/Smarty.class.php on line 1095 のエラーが出てしまいます。 ちなみに/111/というディレクトリは、$template_dir以下、$template_dir/111/です。 {include file="contents.tpl"} {include file="file:contents.tpl"} {include file="絶対パス/contents.tpl"} {include file="file:絶対パス/contents.tpl"} など試しましたが、ダメでした。 知恵をお貸しください。よろしくお願いします。

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

    下記のsedコマンド正規表現の意味がわかりません どのような動きをしているのか教えて下さいm(__)m $ file_name="linux.txt" $ echo $file_name | sed -e "s/.*\.\([^.]*\)\$/\1/g" txt

  • PHPの正規表現でHTMLタグの内容を抽出したい

    jqueryでPHPにurlを渡して、そのurlの中のtitleタグの内容を抽出したいと思ってます。が、うまく行きません。 ●jquery↓ <script type="text/javascript"> function site_check(){ var url = $("#url0").val(); if(url=="") return; $.getJSON("test.php?url=" + encodeURI(url) ,function(res){ $("#title").html(res.title); }); } </script> ●test.php↓ $html=file_get_contents($_GET["url"]); preg_match_all("/<title>(.*?)<\/title>/i",$html,$html_title); header('Content-type: application/json'); echo json_encode($html_title); このコードではなにもレスポンスが帰って来ません。 もし足りない情報がありましたらご指摘ください。

    • ベストアンサー
    • PHP
  • 正規表現で指定範囲すべて除去する方法

    正規表現で {○○○○}の中を全て除去する場合 echo preg_replace('/{.*?}/', '', $html); で{ 文字は除去できる }の中が全て文字だけの場合は除去できるのですが、 { <div>タグを含むと除去できないので困っています</div> }とすると echoした場合に{ <div>タグを含むと文字も除去できな、すべて表示</div> }はそれごとすべてHTML表示されます。 { }内の{}やタグ、文字を全て除去する正規表現はどうすればよいのでしょうか? --------------------------------------------------- $html= <<<_EOD_ <HTML> <HEAD> <title>ここにページタイトルを記述する</title> </HEAD> <BODY> <p>ここの文章は表示する</p> { <div>ここにエリアは表示しない</div> } </BODY> </HTML> _EOD_; echo preg_replace('/{.*?}/', '', $html); -------------------------------------------------------------

    • 締切済み
    • PHP
  • smartyについて

    smartyにでサイトを作る際のテンプレート構造について質問です。 現在はindex.phpで $smarty->display('hoge.tpl'); としhoge.tplは {include file="./common/header.tpl"} <div id="contents"> {include file="./common/left_side.tpl"} <div id="center"> ここに表示する内容 </div> {include file="./common/right_side.tpl"} </div> {include file="./common/footer.tpl"} のようにしています。 表示する内容はそれぞれ違うものの全てではありませんがincludeする tplは他のページもほぼ同様ですのでもっと効率的にできるのでは?と 思うのですがどんな方法があるでしょうか?

    • 締切済み
    • PHP
  • preg_matchの正規表現がうまくいかない

    たとえば、http://gehasoku.com/?p=2のソースコードには ------------------- <rdf:Description rdf:about="http://www.com/aaa.html" trackback:ping="http://www.com" dc:title="タイトル" dc:identifier="http://iii.com/bbb.html" dc:subject="ハードウェア" dc:description="1 名前:名無しさん " dc:creator="soft_net" dc:date="2012-02-21T20:05:01+09:00" /> ------------------- のような形の<rdf:Description~~~/>タグの情報ががいくつかあると思います。これらすべてを文字列として取得したくて、次のようなphpを作成しましたが、うまく動作しません。 原因はどうやらpreg_match_allの正規表現がうまくいっていないからのようですので、 <rdf:Description~~~/>を抜き出すことができる正規表現を教えてください。 自分でもここでチェックしながらやりましたが、 http://www.rider-n.sakura.ne.jp/regexp/regexp.php <rdf:Description~をマッチすることはできても、/>で閉じることができませんでした。 よろしくお願いします。 <?php $url="http://gehasoku.com/?p=2"; $html=file_get_contents($urls); preg_match_all("/<rdf:Description(.*)?\/>/",$html,$match); print_r($match); foreach($match[1] as $value){ echo $value; } ?>

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

    いつもお世話になっております。 ===例=== <a href="index.html">TEST1</a><br /> <a href="index.html?test=b">TEST2</a><br /> <a href="index.html?uid=NULLGWDOCOMO">TEST3</a><br /> <a href="index.html?test=a&uid=NULLGWDOCOMO">TEST4</a><br /> PHPのpreg_replaceを用いて リンクのパラメータに、uid=NULLGWDOCOMOがなければ付加したいのですが、 さっぱり方法がわかりません。 上記の例で、TEST1のリンクの場合は、TEST3 のように、 TEST2のリンクの場合はTEST4のようにしたいです。 もともとTEST3、TEST4のようにキーが付いてるケースもあり、そのときは無視です。 正規表現にお詳しい方よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう