[PHP-users 20555] Re: 再帰(?)正規表現置換について

Eiji Miwa miwa @ offside.ne.jp
2004年 2月 23日 (月) 18:51:32 JST


 ミワです。
 #なんだかすっかり出遅れてしまいましたが...。

On 2004年 2月 19日 , at 09:15 PM, Osamu Shigematsu wrote:

> で、入れ子の解決のコードは Segment Fault になったので、無限マッチ状態な
> のかもしれません。ミワさんのコードだと、マッチを {def hoge} の部分でまと
> めて固定長で扱っていたのを下手に可変長対応したからなと思ってます。
> これもうまくいけば、報告いたします。

 すいません。ただの手抜きです。
 最新版を拝見させて頂きましたが、ちゃんと直ってましたね。

 少し時間が出来たので、$i、$dst を使わないで書かけないかなと、試しに書いてみました。
 #md5 の部分は、とりあえずで入れてありますが、ユニークであれば何でも構いません。
 #$p[1] はデザイナーに優しくということで。

   function _parse ( $src )
   {
     $p = array ( '/<!--{(each|def) 
([^\W_]\w*)}-->((?:(?>(?:(?!<!--{\/?\1 \2}-->).)*)|(?R))*)<!--{\/\1 
\2}-->/se', '/<!--\s*{\s*(\/?)\s*(each|def)\s+([^\W_]\w*)\s*}\s*-->/s', 
'/\{([^\W_]\w*)\}/' );
     $r = array ( '( \'each\' == \'\1\' ) ? sprintf ( \'<?php function 
func_%1\$s ( &$val ) { extract ( $val, EXTR_REFS ); ?>%2\$s<?php } 
foreach ( $%3\$s as $val ) { func_%1\$s ( $val ); } ?>\', md5 ( uniqid 
( rand (), 1 ) ), preg_replace ( $p, $r, str_replace ( \'\"\',\'"\', 
\'\3\' ) ), \'\2\' ) : sprintf ( \'<?php if ( @count ( $%s ) ) { 
?>%s<?php } ?>\', \'\2\', preg_replace ( $p, $r, str_replace ( 
\'\"\',\'"\', \'\3\' ) ) )', '<!--{\1\2 \3}-->', '<?php echo $\1; ?>' 
);
     return '<?php extract ( $_val, EXTR_REFS ); ?>' . preg_replace ( 
$p[0], $r[0], preg_replace ( $p[1], $r[1], preg_replace ( $p[2], $r[2], 
$src ) ) );
   }

--
 miwa at offside.ne.jp



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