[PHP-users 20442]=?ISO-2022-JP?B?UmU6IFtQSFAtdXNlcnMgMjA0MzJdIFJlOiAbJEI6RjUi?= =?ISO-2022-JP?B?KD8pGyRCQDU1LEk9OD1DVjQ5JEskRCQkJEYbKEI=?=

Eiji Miwa miwa @ offside.ne.jp
2004年 2月 19日 (木) 00:32:06 JST


 ミワです。

On 2004年 2月 18日 , at 06:37 PM, UNO Shintaro wrote:

> テストパターンはこんな感じでしょうか。
> <!--{def a}--><!--{def a}--><!--{/def a}--><!--{/def a}--><!--{def 
> a}--><!--{/def a}-->
>
> このパターンで最初の{def a}と2番目の{/def a}を対応させるのは、
> 「正規表現は数を数えられない」ため正規表現だけでの実現は厳しいです。
> うまいtrickが無い限り、解決には、再帰降下型文法解析や文脈自由文法の
> 導入が要ると予想します。

 正規表現はあまり詳しくないのですが、
 面白そうだったので試しにやってみました。

   $str = '<!--{def a}--><!--{def a}--><!--{/def a}--><!--{/def 
a}--><!--{def a}--><!--{/def a}-->';

   $nest = 1;
   $pattern = array_fill ( 0, $nest,
     '/<!--{def\s+([A-Za-z][A-Za-z0-9_]*)}-->'.
     '(((?>.+?)|(?R))*?)'.
     '<!--{\/def\s+\1}-->/s' );
   $replacement = array_fill ( 0, $nest,
     '<?php if (@count($\1)) { ?>\2<?php } ?>' );
   $result = preg_replace ( $pattern, $replacement, $str );

  $nest = 1 の場合の結果
 <?php if (@count($a)) { ?><!--{def a}--><?php } ?><!--{/def a}--><?php 
if (@count($a)) { ?><?php } ?>

  $nest = 2 の場合の結果
 <?php if (@count($a)) { ?><?php if (@count($a)) { ?><?php } ?><?php } 
?><?php if (@count($a)) { ?><?php } ?>

 ネストの分だけ繰り返してるのがスマートじゃないですが、
 こんなやり方もあるということで。
--
 miwa at offside.ne.jp



PHP-users メーリングリストの案内