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