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

UNO Shintaro uno @ venus.dti.ne.jp
2004年 2月 18日 (水) 17:02:36 JST


> とりあえず、" は \" になるのですが、' はエスケープされないようなので、当
> 面は、' をつかってしのいで、原因を突き止めてみたいと思います。

http://www.php.net/manual/ja/function.preg-replace.php
のツッコミ欄でsteven -a-t- acko dot netさんがこの問題に言及しているのを
見つけました。
・back referenceで値を突っ込むときには「"」はエスケープされて「\"」になる
・「\"」を''の間に入れたら、それを/eで解釈したときに\"のまま戻らない
という理屈で、'solution'は「\"」だけ特殊扱いして「"」に戻す処理を入れろ、
だそうなので、

$r = array(
  '<?php echo $\1; ?>',
  "'<?php if (\\1 @ count(\$\\2)) { ?>'.preg_replace(\$p, \$r, str_replace('\\\"','\"','\\3')).'<?php } ?>'",
  "'<?php function template_'.++\$i.'(\$_ary) { foreach(\$_ary as \$_val) { extract(\$_val, EXTR_OPTION); ?>'.
  preg_replace(\$p, \$r, str_replace('\\\"','\"','\\3')).
  '<?php }} ?>\\1<?php template_'.\$i.'(\$\\2); ?>'");

かな?

テストコードが
$x = new html_template();
$x->parse('x.html', array('x'=>array(array("a"=>1,"b"=>1,"c"=>1),array("b"=>2),array("c"=>3)), 'a'=>2, 'z'=>3));


x.htmlが
{a}
<!--{def x}--><!--{each x}-->"{a}x{b}x{c}"<!--{/each x}--><!--{/def x}-->
<!--{def z}-->"hoehoe"<!--{/def z}-->
{a}

出力結果が
2"1x1x1""1x2x1""1x2x3""hoehoe"2

残ったx.html.tmpが
<?php extract($val, EXTR_OPTION); ?><?php echo $a; ?>
<?php if (@count($x)) { ?><?php function template_1($_ary) { foreach($_ary as $_val) { extract($_val, EXTR_OPTION); ?>"<?php echo
$a; ?>x<?php echo $b; ?>x<?php echo $c; ?>"<?php }} ?><?php template_1($x); ?><?php } ?>
<?php if (@count($z)) { ?>"hoehoe"<?php } ?>
<?php echo $a; ?>

という感じになりました。

-- 
UNO Shintaro, 宇野 信太郎
mailto:uno @ venus.dti.ne.jp
http://www.venus.dti.ne.jp/~uno/



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