2017-10-31 9 views
2

는 다음과 같은 고려 :10 진수가 숫자 값 앞에 오지 않았을 때 나뭇 가지를 가정하는 나뭇 가지?/문자열?

A) {{ form.vars.attr.dimensions.width * .1875 }} 
B) {{ form.vars.attr.dimensions.width * 0.1875 }} 

form.vars.attr.dimensions.width는 정수이다.

다음은 form.vars.attr.dimensions의 덤프입니다.

array:2 [ 
    "width" => 1600 
    "height" => 478 
] 

예 A는 다음과 같은 예외가 발생합니다 : "."값의

예기치 않은 토큰 "구두점".

예 B 올바르게 작동 및 출력 300.0.

나는 그 값을 문자열로 해석 할 가능성이 높지만 내 질문은 인 이유를 이해합니다.? 따옴표로 묶지 않았기 때문에 리터럴로 볼 수 없습니다. number_format, 0을 앞두고 등등으로이 문제를 해결할 수 있다는 것을 알고 있습니다. 왜 왜곡이 왜 십진법을 올바르게 식별하지 못하는 지 궁금합니다. 아니면 내가 다른 것을 놓친 것일 수도 있습니다. 또한

이러한 상황을 생성하지 않는 바닐라 PHP인가 같은 논리 : .1875. 이미 템플릿 렌더링의 제 1 단계에서의 구두점 표시로 확인되었다

<?php 
    $val = 1600; 
    var_dump($val * .1875); 
    // float(300) 
?> 
+0

'나뭇 가지'구현 때문일 가능성이 큽니다. [here] (https://twig.symfony.com/doc/2.x/templates.html)에서 전체 목록을 볼 수 있습니다. 당신은 약간을 향해 아래로 스크롤해야합니다 * 구현 * – DarkBee

답변

2

.

Twig 문서는 Twig Internals에이 프로세스를 설명합니다. 첫 번째 단계에서는 :

렉서 토큰 스트림 Documentation 섹션 The Lexer에서

에 템플릿 소스 코드를 토큰 화, 그것은 토큰 스트림으로 일부 소스 코드를 변환하는 방법을 보여줍니다. 우리는 당신의 두 가지 예에 해당 할 경우 : 프로세스의 다음 단계

Example 1:    Example 2: 

VAR_START_TYPE()   VAR_START_TYPE() 
NAME_TYPE(form)   NAME_TYPE(form) 
PUNCTUATION_TYPE(.)  PUNCTUATION_TYPE(.) 
NAME_TYPE(vars)   NAME_TYPE(vars) 
PUNCTUATION_TYPE(.)  PUNCTUATION_TYPE(.) 
NAME_TYPE(attr)   NAME_TYPE(attr) 
PUNCTUATION_TYPE(.)  PUNCTUATION_TYPE(.) 
NAME_TYPE(dimensions) NAME_TYPE(dimensions) 
PUNCTUATION_TYPE(.)  PUNCTUATION_TYPE(.) 
NAME_TYPE(width)   NAME_TYPE(width) 
OPERATOR_TYPE(*)   OPERATOR_TYPE(*) 
NUMBER_TYPE(0.1875)  PUNCTUATION_TYPE(.)  <---- 
VAR_END_TYPE()   NUMBER_TYPE(1875) 
EOF_TYPE()    VAR_END_TYPE() 
         EOF_TYPE() 

는, 파서가 나무에 토큰 스트림을 변환하는 시도하고 :

$ex1 = '{{ form.vars.attr.dimensions.width * 0.1875 }}'; 
$ex2 = '{{ form.vars.attr.dimensions.width * .1875 }}'; 

$stream1 = $twig->tokenize(new Twig_Source($ex1, 'example1')); 
$stream2 = $twig->tokenize(new Twig_Source($ex2, 'example2')); 

을 출력은 다음과 같다 구두점 토큰은 당신이보고있는 오류를 일으키는 연산자 이후에 이해가되지 않습니다.

첫 번째 단계에서 Twig lexer가 그런 식으로 작동하는 한, the source을 확인하면 표현식 렉서가 입력 문자열을 단계별로 처리하여 다양한 regexes를 순차적으로 적용합니다. 수의 정규식 .1875 일치하지 않으며, 다음 단계에서 .는 문장 부호로 식별되는

'/[0-9]+(?:\.[0-9]+)?/A' 

입니다.

이 답변은 0으로 시작하지 않고 10 진수로 작동하도록하는 방법을 찾는 경우 도움이되지 않지만 작동 원리를 이해하는 데 더 많은 관심이있는 것처럼 들리므로 이것은 도움이 될 것입니다.

+0

이것은 정확하게 내가 찾고있는 것입니다. 자세한 설명을 해주셔서 감사합니다! 그리고 예. 어떤 종류의 문제 해결 방법을 찾아 내려고 시도하는 것보다 호기심이 많았습니다. 고맙습니다 !! –

+0

반갑습니다. 흥미로운 질문을 해줘서 고마워. :) –