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

Eiji Miwa miwa @ offside.ne.jp
2004年 2月 23日 (月) 23:37:25 JST


 ミワです。
 #ここでやめておきます...。

On 2004年 2月 23日 , at 06:51 PM, Eiji Miwa wrote:

> ... ? 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\' ) ...

 これだと、ネストした each の場合、function を再定義しようとしてエラーに
 なってしまうので、function_exists を入れました。(ベタな感じですが)
 #その都合で、extract が無くなってます。

   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 if ( ! 
function_exists ( "func_%1\$s" ) ) { function func_%1\$s ( $_val ) { 
?>%2\$s<?php }} foreach ( $_val["%3\$s"] as $__val ) { func_%1\$s ( 
$__val ); } ?>\', md5 ( uniqid ( rand (), 1 ) ), preg_replace ( $p, $r, 
str_replace ( \'\"\',\'"\', \'\3\' ) ), \'\2\' ) : sprintf ( \'<?php if 
( @count ( $_val["%s"] ) ) { ?>%s<?php } ?>\', \'\2\', preg_replace ( 
$p, $r, str_replace ( \'\"\',\'"\', \'\3\' ) ) )', '<!--{\1\2 \3}-->', 
'<?php echo $_val["\1"]; ?>' );
     return preg_replace ( $p[0], $r[0], preg_replace ( $p[1], $r[1], 
preg_replace ( $p[2], $r[2], $src ) ) );
    }

 テストしたコードはこんな感じです。

sample.html
---
<!--{def item}-->
<p><table border="1"><caption>TABLE.A</caption>
<tr><th>1</th><th>2</th><th>3</th></tr>
<!--{each item}-->
<tr><td>{name}<!--{def new}-->※<!--{/def 
new}--></td><td>{price}</td><td>
<!--{def item}-->
<table border="1">
<!--{each item}-->
<tr><td>{name}<!--{def new}-->※<!--{/def 
new}--></td><td>{price}</td></tr>
<!--{/each item}-->
</table>
<!--{/def item}-->
</td></tr>
<!--{/each item}-->
</table></p>
<!--{/def item}-->

<!--{def item}-->
<p><table border="1"><caption>TABLE.B</caption>
<tr><th>1</th><th>2</th><th>3</th></tr>
<!--{each item}-->
<tr><td>{name}<!--{def new}-->※<!--{/def 
new}--></td><td>{price}</td><td>
<!--{def item}-->
<table border="1">
<!--{each item}-->
<tr><td>{name}<!--{def new}-->※<!--{/def 
new}--></td><td>{price}</td></tr>
<!--{/each item}-->
</table>
<!--{/def item}-->
</td></tr>
<!--{/each item}-->
</table></p>
<!--{/def item}-->
---

test.php
---
<?php
require_once ( 'html_template.php' );
$val = array (
   'item' => array (
     array ( 'name' => 'A', 'price' => 1, 'new' => 1,
       'item' => array (
         array ( 'name' => 'X', 'price' => 10, 'new' => 1 ),
         array ( 'name' => 'Y', 'price' => 20 ))),
     array ( 'name' => 'B', 'price' => 2 ),
     array ( 'name' => 'C', 'price' => 3, 'new' => 1,
       'item' => array (
         array ( 'name' => 'Z', 'price' => 30 )))));
html_template::parse ( 'sample.html', $val );
?>
---
 
--
 miwa at offside.ne.jp



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