[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 メーリングリストの案内