亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Twig 自動刪除撇號和引號

Twig 自動刪除撇號和引號

PHP
慕村225694 2021-12-03 15:41:08
TransTokenParser為了學習(解析{% trans %}和{% trans with %}),我創建了自己的-> 并且解析器本身運行良好,除了后一種變體:trans with.解析器讀出分配的變量,但會自動轉義",'因此它們不會顯示(變量沒有'或"直接來自解析器)。例如,我們在樹枝中有這個塊:{% trans with {'{test}': coolFunctionWhichReturnsString('testParameter')} %}UNIQUE_TRANS_ID{% endtrans %}這個塊被 trans 和諸如此類的東西解析得很好,但將“with”之后的部分變成了這樣: {{test}: coolFunctionWhichReturnsString(testParameter)}我試過在 Twig_Environment 中設置一個參數new Twig_Environment(..., ['autoescape' => false])我試過在 config.yml 下的 twig 中設置一個全局變量:autoescape: false這兩種解決方案都沒有反映 twig -> php 行為的變化。(它將 autoescape 設置為 false,如在此處初始化樹枝環境時的 var_dump 中所見:array (size=13)  'debug' => boolean true  'charset' => string 'UTF-8' (length=5)  'base_template_class' => string 'Twig_Template' (length=13)  'strict_variables' => boolean true  'autoescape' => boolean false這是我的代碼:/** * @return array * @throws \Twig_Error_Syntax */private function parseVariant(): array{    $stream = $this->parser->getStream();    $trans = null;    $json = null;    //SIMPLE VARIANT trans    $stream->nextIf(\Twig_Token::PUNCTUATION_TYPE, '');    if (null !== $stream->nextIf(\Twig_Token::BLOCK_END_TYPE)) { //%} TRANS_LITERAL        $stream->nextIf(\Twig_Token::PUNCTUATION_TYPE, '');        $trans = $stream->expect(\Twig_Token::TEXT_TYPE)->getValue();    } elseif (null !== $stream->nextIf(\Twig_Token::NAME_TYPE, 'with')) { // {% trans with {} %} TRANS_LITERAL        $stream->next();        $json = implode($this->getInlineParams());        $stream->nextIf(\Twig_Token::PUNCTUATION_TYPE);        $stream->nextIf(\Twig_Token::BLOCK_END_TYPE);        $stream->nextIf(\Twig_Token::PUNCTUATION_TYPE);        $trans = $stream->expect(\Twig_Token::TEXT_TYPE)->getValue();        //die();    }  編輯:使用 ExpressionParser 會引發錯誤,因為鍵/值沒有 "" 或 ''..另一個編輯:我已經嘗試在 twig 中修改運行時和初始化后的“轉義”擴展,包括所有策略 - 沒有任何幫助有什么建議?提前致謝。
查看完整描述

1 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

這是一個雙重問題:第一個可能是在getInlineParams函數中簡化邏輯的方法,這對于這些簡單的情況可能沒有問題,但對于更復雜的情況可能會很糟糕。

第二個問題是完全無視類型。

{'{test}': coolFunctionWhichReturnsString('testParameter')}

被解析為(讀作“字符串值”-“令牌類型”):

  • { - 阻止開始

  • {test} - 一個字符串

  • : - 標點符號

  • coolFunctionWhichReturnsString - 一個名字

  • ( -(不確定是哪種類型)

  • testParameter - 一個字符串

  • ) - (再次)

  • } - 塊結束

當您嵌套多個 {} 時,第一個問題將展開。第二個問題是由于一個簡單的事實:

類型很重要。

詞法分析器有一項非常重要的任務,它刪除用戶可能選擇表達字符串、注釋的所有不同變體,它刪除不相關的空格(因為它只是雜亂無章)等等?,F在,如果你把每個Token(有一個值和一個類型)當作只是一個包含你想要的字符串的奇怪對象,你就會遇到問題 - 很明顯。

因此,如果要重新創建類似于原始輸入的內容,則必須查看類型并在類型為字符串時添加引號。(文本可能是塊之外的所有東西)

這將是您所述問題的快速“解決方案”

但是,從長遠來看,忽略標記的語義會導致問題……因為您還必須以某種方式處理“coolFunctionWhichReturnsString”,即,您必須將其轉換為某個函數調用。從理論上講,您應該真正構建一個 AST 并在某個時候將其編譯成適當的形式......

樹枝解析器使用一種方法subparse來解析內容,直到出現某個“結束”。(建立 AST,因為結構在某些時候也很重要)

更新:事實證明,在樹枝文檔中有一個用于編寫節點解析器的頁面,如果您遵循https://twig.symfony.com/doc/2.x/advanced.html,它可能會簡化很多#registering-a-new-tag(信息從略高于“注冊新標簽”開始,非常簡化了值的解析和使用)


查看完整回答
反對 回復 2021-12-03
  • 1 回答
  • 0 關注
  • 232 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號