2011-09-18 6 views
1

정규식과 일치하는 부분이 일치하지 않는 자바 스크립트 템플릿 파서에 문제가 있습니다. 나는 정규 표현식을 테스트했으며, 이전에 작동 중이었기 때문에 내 코드와 관련이 있다고 생각하게했다.템플릿 정규식이 유효한 패턴의 절반과 일치하지 않습니다.

문제는 codeblock 정규식입니다. 템플릿의 유효한 패턴 4 개 중 2 개가 일치하지 않습니다.

나는 다음과 같은 기능이 있습니다 :

<script id="ReturnLineDataRowTemplate" type="text/template"> 
     <tr> 
      <td><input type="checkbox" /></td> 
      <td> 
       <input type="text" class="textBox" id="orderline_0" name="orderline_0" value="#{_product._id}#" /> 
      </td> 
      <td>#{_product._description}#</td> 
      <td> 
       <input type="text" class="textBox" value="#{quantity()}#" /> 
      </td> 
      <td>#{_product._primaryUOM._description}#</td> 
      <td> 
       ${ControlBind("Select", {'SelectedValue': 'LK', 'Options' : getReturnTypes(_currentReturn._businessUnit), 'OptionValueKey' : '_code', 'OptionTextKey': '_description' })}$ 
      </td> 
      <td> 
       <input type="text" class="textBox" /> 
      </td> 
      <td>%{ toFixedEx(@{unitPrice()}@,2,4) }%</td> 
      <td>%{ toFixedEx(@{deposit()}@,2,4) }%</td> 
      <td>%{ toFixedEx(@{surcharge()}@,2,4) }%</td> 
      <td>%{ toFixedEx(@{extendedPrice()}@,2,2) }%</td> 
     </tr> 
    </script> 

결과 : 다음 템플릿

function LoadParsedRowTemplate(rowData, type) { 

    var template = Templates[type]; 
    var replacement = null; 
    var result = null; 
    var expression; 

    var refbinder = /@\{[\S\s]*?}@/g; 
    var databinder = /#\{[\S\s]*?}#/g 
    var codeblock = /%\{[\S\s]*?}%/g; 
    var ctlbinder = /\$\{[\S\s]*?}\$/g; 

    try { 

     while ((result = refbinder.exec(template)) != null) { 
      replacement = "rowData." + result[0].substring(2, result[0].length - 2); 
      template = template.replace(result[0], replacement); 
     } 

     while ((result = databinder.exec(template)) != null) { 
      replacement = eval("rowData." + result[0].substring(2, result[0].length - 2)); 
      template = template.replace(result[0], replacement); 
     } 

     while ((result = codeblock.exec(template)) != null) { 
      expression = result[0].substring(2, result[0].length - 2) 
      replacement = eval(expression); 
      template = template.replace(result[0], replacement); 
     } 

     while ((result = ctlbinder.exec(template)) != null) { 
      replacement = eval("$.fn.ScreenSetup." + result[0].substring(2, result[0].length - 2)); 
      template = template.replace(result[0], replacement); 
     } 
    } 
    catch (err) { 
     $.error("Error: Data template Binding Error: " + err.toString()); 
    } 

    return template; 

} 

성냥을 반복

  <td><input tabindex="0" type="checkbox"></td> 
      <td style="width: 125px;" align="left"> 
       <input tabindex="0" class="textBox" id="orderline_0" name="orderline_0" value="5003" type="text"> 
      </td> 
      <td style="width: 250px;" align="left">Chris Product 3</td> 
      <td style="width: 125px;" align="left"> 
       <input tabindex="0" class="textBox" value="4" type="text"> 
      </td> 
      <td style="width: 125px;" align="left">Each</td> 
      <td style="width: 125px;" align="left"> 
       <select tabindex="0" class="dropdownlist"><option value="OD">1-Outdated</option><option value="REC">2-Recall</option><option value="RTC">3-Reduced to Clear</option><option value="LK" selected="selected">4-Leaker</option><option value="SBD">5-Sour Before Date</option><option value="PW">6-Product Withdrawal</option><option value="DM">7-Damaged</option><option value="TR">8-Tickets Redeemed</option><option value="PL">9-Product Launch</option><option value="BB">Buy Back</option></select> 
      </td> 
      <td style="width: 125px;" align="left"> 
       <input tabindex="0" class="textBox" type="text"> 
      </td> 
      <td style="width: 125px;" align="right">81.40</td> 
      <td style="width: 125px;" align="right">%{ toFixedEx(rowData.deposit(),2,4) }%</td> 
      <td style="width: 125px;" align="right">0.00</td> 
      <td style="width: 125px;" align="right">%{ toFixedEx(rowData.extendedPrice(),2,2) }%</td> 

답변

1

더 좋은 방법은 사용하는 것입니다 .replace with a callback 예 :

var codeblock = /%\{([\S\s]*?)\}%/g; // note the added capturing group 
template = template.replace(codeblock, function(g0,g1){ 
    return eval(g1); 
}); 

예 : http://jsbin.com/owunoy/2

+1

나는 * 정확히 * 원래 코드의 문제가 무엇인지 확실하지 않다. 하나의 이슈는'replace'를 사용한 후에 (문자열의 길이가 다르기 때문에) 'lastIndex' 속성이 올바르지 않다는 것입니다. 그러나 길이는 여기서 설명하기에 충분히 길거나 짧습니다. 'lastIndex'를 수동으로 올바른 위치로 설정하면이 문제를 해결할 수 있습니다. – Kobi

관련 문제