簡體   English   中英

多個遞歸模式似乎不起作用

[英]Multiple Recursion Patterns don't seem to work

我有一個模板類來處理模板,因此,這是從該類中摘錄的一行。 我將保留許多細節,因為許多細節與加載模板有關。

$tmpl = <<<tem
    <div id="header2">
<a rel="home" href="//localhost/index.php">
    <h1>Test Site</h1>
</a>
</div>
<nav>
    <div class="menu">
        <ul>
            <li class="base">
                <a rel="home" href="//localhost/index.php">Home</a>
            </li>
            <li><a href="//localhost/search.php">Search</a></li>
            {if(\$is_guest)}
                <li><a href="//localhost/member.php?view=register">Register</a></li>
                <li><a href="//localhost/member.php?view=login">Login</a></li>
            {/if}{else}
                <li><a href="//localhost/profile.php?uid=1">Profile</a></li>
                <li><a href="//localhost/usercp.php">My Account</a></li>
                <li><a href="//localhost/member.php?view=logout">Logout</a></li>
            {/else}
            {if(\$is_admin)}
                <li><a href="//localhost/admin">Admin</a></li>
            {/if}
            {!nav}
        </ul>
        <div class="floater"></div>
    </div>
</nav>
tem;

    $tmpl = preg_replace_callback('#{\$(.+?)}#u',array(get_class($this),'varsub'),$tmpl);
    $tmpl = preg_replace_callback("#{if\(([A-Za-z0-9\$_!]+)\)}((?:(?R)|.*?)+)\{/if\}\{else\}((?:(?R)|.*?)+)\{/else\}#ismu",array(get_class($this),'boolelsesub'), $tmpl);

由於某種原因,此正則表達式導致頁面從不加載,而不是按照我的期望進行加載。 我看過許多在線資源,但是似乎都沒有提到一次使用兩個遞歸模式。

它似乎也沒有到達我分配給它的回調。

protected function boolelsesub($input)
{
    var_dump($input);
    $h = fopen('bah.txt', 'a');
    fwrite($h,'test');
    fclose($h);
    exit;
}

編輯: boolelsesub的內容已被精簡以使其易於調試。

嘗試使用以下模式:

$pattern = <<<'LOD'
~
{ if \( ([^)]+) \) }

( (?>[^{]+|(?R))* )

{ / if }
(?:
    { else }

    ( (?>[^{]+|(?R))* )

    { / else }
)?
~ix
LOD;

在線演示

即使您的模式與此編輯一起使用,由於(?:(?R)|.*?)+ ,結果也將無效。 這部分效率低下,特別是因為.*? 是惰性的,可以匹配空字符串。 為了解決這個問題,我將其替換為帶有貪婪的量詞[^{]+的否定字符類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM