2017-12-06 2 views
1

Ich habe eine Situation, wenn es viele Vorlagen gibt, die verschiedene Variablen verwenden. Wie kann ich eine Liste aller Variablennamen innerhalb einer Vorlage erhalten, so dass ich genau übergeben konnte, was die Vorlage beim Rendern benötigt?Wie kann ich eine Liste aller in einer Vorlage verwendeten Variablen erhalten?

Ich weiß, ich kann regulären Ausdruck verwenden, aber es ist nicht so einfach zu implementieren, wie es scheinen mag. Die Syntax um den Variablennamen kann sich wirklich unterscheiden und ich habe weder Zeit noch Ressourcen, um jede mögliche Situation zu finden.

+0

Sind nunchunchs Template-Variablen nicht von '{{name}}' eingeschlossen? Wenn Sie das erfassen wollen und dennoch alles ausschließen, was beispielsweise ein Funktionsaufruf ist, ist das relativ einfach. Wie sehen die Namen Ihrer Vorlagenvariablen aus? – msanford

+0

Das stimmt. Aber die Variable wird nicht immer perfekt wie '{{name}} 'erscheinen. Es könnte '{{name.child.grandchild}}', '{{name [" child "]}}' oder '{{name [i]}}' und viele andere Ausdrücke sein. Ich muss wissen, was die Eigenschaftsnamen des "Kontext" -Objekts sein sollten, das ich beim Rendern übergebe. – Qualphey

+0

Ja, aber wenn wir wissen, dass das, was in '{{}}' erscheint, immer ein Kandidat ist, und dass die paar _not_kandidaten Funktionsaufrufe sind (die '() 'enthalten), können wir eine Regex erstellen, um nach allen zu suchen '{{}}', die nicht '()' in ihnen haben. Oder fängt das nicht genug ein? – msanford

Antwort

0

Ein regex noch würde angesichts der folgenden minimalen Testfällen arbeiten:

{{ name }} 
{{ name.child }} 
{{ name[child] }} 
{{ name["child"] }} 
{{ name_last["child"] }} 
{{ name1["child"] }} 
{{ function() }} 
{% if variable %} 

Also, wenn Sie dies als pcre (obwohl die Frage markiert analysieren wollte mein Verständnis ist, dass Sie will die Seite) vorab zu analysieren, Sie:

  • Geben Sie für eine Öffnung {{ und eine Schließ }}, gepolsterten optional Leerzeichen: {{\s?\s?}}
  • Achten Sie auf den ‚Kopf‘ einen Kontext Satz: ([\w]+)
  • Erstellen Sie eine zweite Nicht-Capture-Gruppe mit dem Material, das Eigentum Selektoren abgrenzt: ((?:\..+)|(?:\[.+))?

Und Sie sind links mit: {{\s?([\w]+)((?:\..+)|(?:\[.+)?)\s?}} deren ersten Erfassungsgruppe ($1), die in der Testprobe name, name_last und name1 übereinstimmen wird.

Live example.

Verwandte Themen