• ベストアンサー

コメントタグに挟まれた部分を正規表現で検索したい。

正規表現初心者です。 $html=' ~略~ <!--{loop|news}--> <li>{news|month}月{news|day}日 ・ {news|text} </li> <!--{/loop|news}--> ~略~ '; といった文字列から、 <!--{loop|○○}-->~<!--{/loop|○○}--> というパターンの部分を検索したいのですが、どのように書けばよいのでしょうか? ereg("<!--{loop\|([[:alnum:]_]+)}-->()<!--{/loop\|([[:alnum:]_]+)}-->",$html, $matches); などと書いてみたのですが、真ん中あたりにある、「()」のところをどうかけば良いのかが分かりません。(日本語が混じっているので、どのように書いてよいのか分かりません。) ご教授お願いいたします。

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

単純に.*で良いような気がします (このままでは、一番広い範囲になるような気もします) preg_match("/<!--{loop\|(\w+)}-->(.*?)<!--{\/loop\|(\\1)}-->/s",$html, $matches); にするとか

leeeeeeee
質問者

お礼

ありがとうございます。 とても参考になりました!

その他の回答 (1)

  • raumens
  • ベストアンサー率0% (0/1)
回答No.2

真ん中の()はいらないような気がします。 これでいいんじゃないでしょうか? ereg("<!--{loop\|([[:alnum:]_]+)}-->.*?<!--{/loop\|([[:alnum:]_]+)}-->",$html, $matches);

leeeeeeee
質問者

お礼

ありがとうございます。 中央の値は、必要だったので、()でくくりました。

関連するQ&A

  • 正規表現でOR

    正規表現について困っています。 $text = '&a=000&b=111&c=222'; mb_ereg('&b=(.*?)&', $text, $result); 上記のように、スタートを&b=とし、エンドを&とすれば、'b=111' の中の '111'  は抽出できます。 ところが、$textには次のようなパターンもあります。 $text = '&a=000&b=111'; この場合、エンドを示す文字が文末のために存在しませんので、 mb_ereg('&b=(.*)', $text, $result); とやれば抽出できます。 やりたいことは、上記の2つのパターンに対応する正規表現を1行で記述したいのです。ORを表す表現を調べていろいろ試したのですが、うまくいきません。 よろしくご指導のほどお願いいたします。

    • ベストアンサー
    • PHP
  • javaの正規表現について質問です。

    javaの正規表現matchesに関して質問です。 正規表現を用いて文字列が半角数字のみで出来ているかどうかを判定したいと思っています。 調べたとろこ下記の正規表現で判定できそうなのですが、 正規表現のルールが理解できず困っています。 ------------------------------------------- String aaa = "0123456789"; //パターン1 aaa.matches("^[0-9]{10,11}$"); //パターン2 aaa.matches("^[0-9]+$") ------------------------------------------- パターン1 ^[0-9]   →  文字列の先頭が0~9か判定 {10,11}   →  10~11回繰り返す(繰り返すというのは[0-9]かどうかということでしょうか?)           12文字目に文字を入れた下記文字列でもfalseが返ってきました。           解釈が間違えている?           String aaa = "0123456789a"; $      →  文字列の最後が[0-9]を10~11回繰り返しているかどうか? パターン2 ^[0-9]   →  文字列の先頭が0~9か判定 +$ →  文字列の最後が???? すいません自分で書いてて混乱してきました。 どなたかアドバイス下さい。

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

    すみませんが、教えてください。 PHP+MYSQLで掲示板のようなサイトを作っています。 投稿したコメントの中にURLがある場合、次の変換で、リンクを設定するようにしています。 $str = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>", $aStr); さらに、次のことがしたいのですが、どうすれば良いのか教えてください。 (1)URLが長い場合、表示する文字列を指定文字数でカットする。 (2)URLのみをリンク設定付で切り出す。 当方、正規表現がほとんど理解できていません。 (オイラリーの本を買ったのですが、時間がなくて学習できていません。) 申し訳ございませんが、こうすれば良いというコードを教えていただければ、幸いです。

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

    正規表現のエスケープしなければいけない文字が文字列に含まれているかどうかをチェックしたいのですがうまくいきません。 今は、下記のようにしてnoと表示されます。 よろしくお願いします。 String str ="(1)test"; Pattern p; Matcher m; p = Pattern.compile("\\(1\\)"); m = p.matcher(str); if(m.matches()) { System.out.println("ok"); }else{ System.out.println("no"); }

    • ベストアンサー
    • Java
  • 独自タグを正規表現で取る方法

    今下のような文字列から、正規表現を使って##LOOP_START##から##LOOP_END##の間の文字列を抜き出そうとしています。 $target = '##LOOP_START##123 456789##LOOP_END##'; コードは以下です。 preg_match_all('/##LOOP_START##(.+?)##LOOP_END##/', $target, $matches); しかし、戻り値は0が帰ってきており、何も取得できません。 いろいろ調べたていたのですが、何か悪いのかさっぱりわからないので 投稿させていただきました。 ちなみに $target = '##LOOP_START##123456789##LOOP_END##'; のように途中が改行されていなければ 問題なく取得できました。 改行も含めてどうやったら抜き出せるでしょうか。。 よろしくお願いしますm(_ _)m

    • ベストアンサー
    • PHP
  • 正規表現で自動リンク後、長いURL表示を丸めたい

    お世話になります。 PHP4で作った掲示板を運営しています。 過去ログを参考にし、以下の正規表現で投稿本文中のURLを自動リンクしています。 $text=ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href='\\0'>\\0</a>",$text); 今の問題は、長いURLを貼られたときに折り返しされず掲示板のレイアウトが崩れることです。 そこで<a>~</a>間の表示部分だけ規定文字数で丸めたいのですが、なかなか良い方法が思いつきません。 どなたかお知恵を貸してください。 ちなみに応急処置として、親<td>タグに style="word-break:break-all;" を入れています。 でもこれだとIE以外は効果ないので・・・。

    • ベストアンサー
    • 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
  • .NET正規表現で(?=...)を使えない?

    お世話になります。 以下のページ(.NET Framework 開発者ガイド>グループ化構成体) http://msdn.microsoft.com/ja-jp/library/bs2twtah(VS.80).aspx に、.NET正規表現について以下のようなパターンがあります。  (?= subexpression) ゼロ幅の正の先読みアサーションです。(略)  (?! subexpression) ゼロ幅の負の先読みアサーションです。(略)  (?<= subexpression) ゼロ幅の正の後読みアサーションです。(略)  (?<! subexpression) ゼロ幅の負の後読みアサーションです。(略) これらは、あるパターンが注目している前/後に現れる/現れないかどうかをチェックするけど、それらをキャプチャーしないというものです。 これを使いたいのですが、使えません。以下はVBScriptのプログラムで、WSCript 5.6および5.7で動作させました。(インデントを表現するために全角空白を使っています。実際に動かしてくださる方はタブ文字かなにかに変換願います) Option Explicit Dim objRegExp ' 正規表現オブジェクト Dim objMatches ' 検索結果 Dim objMatch ' 検索結果 Dim strMessage ' 表示メッセージ Set objRegExp = New RegExp objRegExp.Pattern = "(?<=「)[^」]+(?=」)" objRegExp.IgnoreCase = True objRegExp.Global = True Set objMatches = objRegExp.Execute("カッコ前「カッコ中」カッコ後") WScript.Echo objRegExp.Pattern & " は" For Each objMatch In objMatches  strMessage = " " & objMatch.FirstIndex + 1 & _   " 文字目に見つかりました。" & _   "一致した文字列は " & objMatch.Value & " です。"   WScript.Echo strMessage Next Set objMatches = Nothing Set objRegExp = Nothing ところが、  objRegExp.Pattern = "(?<=「)[^」]+(?=」)" のところで「正規表現で構文エラーになりました」となります。 これを、もっと簡単なパターン、  objRegExp.Pattern = "(?:「)[^」]+(?:」)" とすれば動くことは分かっているんですが、今の私の主眼としては「(?<=...)」および「(?=...)」を使いたいんです。 他に、Word 2007 の VBA を試しましたがダメでした。 正規表現自体は合っているようです。 というのは、以下のテストツールで動作できたからです。 http://www.ultrapico.com/Expresso.htm ということで、これらの新しい .NET 正規表現を VBScript や VBA で動かす方法はあるでしょうか。 よろしくお願いいたします。

  • 正規表現について

    お世話になります。 ●●● ●●● という文字列かどうか判断する正規表現を作成したいです。 条件としては、 ・「文字1 (←全角スペース)文字2」という感じで、文字1と文字2に全角スペースが挟まれている感じで、文字列の先頭にも末尾にも空白文字は入ってはいけない(真ん中に1つのみ) ・文字1と文字2には、数字・空白以外の文字が入る(主に感じ・ひらがな・カタカナが入る)(文字数は一文字以上) といったところです。 自分で作成した正規表現は、 $pattern = '/^([\d\S])+ ([\d\S])+$/'; if( !preg_match($pattern,$chkStr) ) print "マッチしていない"; } なんですが、どうもマッチしてほしい文字にマッチしていないようなのです。 お手数ですがご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現パターンの記入方法について

    とあるサイトで、 「URL からドメイン名を得る」という項目があったのでマネして やってみたらうまくいきました。しかし正規表現パターンの意味は 理解できませんでしたので理解できなかった部分だけをのせたスクリプトを以下にまとめました。 <?php // まずUPLからホスト名を得る preg_match('@^(?:http://)?([^/]+)@i', "http://www.nantoka.com/index.html", $matches); $zenbu=$matches[0]; $host = $matches[1]; $saigo=$matches[2]; /*必要なのはホスト名だけですが、$matches[0]や$matches[2]には どんな文字列が格納されるか気になって出力することにしました*/ print($zenbu); print("<br/>"); print($host); print("<br/>"); print($saigo); print("<br/>"); ?> これを実行した結果は、 $zenbuが「http://www.nantoka.com」で、 $hostが「www.nantoka.com」で、 $saigoがなにもなしでした。 このスクリプトでわからない部分は、'@^(?:http://)?([^/]+)@i'の部分と、$host = $matches[1];の部分です。 まず正規表現パターンの最初のアットマークの後ろの^は「次の文字列からはじまる」と解釈しました。 最後のアットマークの後ろのiは、「大文字と小文字を区別しない」という意味だと解釈しました。 カッコで囲まれている(?:http://)と、([^/]+)は、サブマッチパターン だと思いました。 $matches[0]には、"http://www.nantoka.com/index.html"の 中で'@^(?:http://)?([^/]+)@i'に当てはまるもの全体が格納され、 $matches[1]には、(?:http://)に当てはまるもの、 $matches[2]には、([^/]+)に当てはまるものが格納されると考えました。 [^/]+は、「スラッシュを含まない文字が1文字以上」と解釈しました。 ただ、その他の事については考えましたがよくわからず、 特になんで(?:http://)にあたるものが「www.nantoka.com」 になるのかさっぱりわかりません。 (?:http://)の中にあるhttp://の前の?:が一体何なのか、 (?:http://)と([^/]+)の間にある?は何なのか、 両端のアットマークは何なのか(マッチ演算子かと思って スラッシュに置き換えて実行してみたらエラーになりました。) うまく説明できませんがとにかくその辺のことがよくわかりませんでした。どなたか教えていただけませんか。

    • 締切済み
    • PHP