2009-06-09 4 views
2

'잘라내 기 단어'는 단어 열을 받아서 첫 번째 단어 만 반환합니다 (예 : 10 단어). 도장 (자바 스크립트 라이브러리)가, 그 코드와 같은 기능을 가지고에서javascript에서 단어 잘라 내기 기능 (dojo 코드 연구)

은 이것이다 : dojox.dtl.filter.strings._truncatewords./(&.*?;|<.*?>|(\w[\w-]*))/g

왜이과 같이 기록되지이다

truncatewords: function(value, arg){ 
    // summary: Truncates a string after a certain number of words 
    // arg: Integer 
    //    Number of words to truncate after 
    arg = parseInt(arg); 
    if(!arg){ 
      return value; 
    } 

    for(var i = 0, j = value.length, count = 0, current, last; i < value.length; i++){ 
      current = value.charAt(i); 
      if(dojox.dtl.filter.strings._truncatewords.test(last)){ 
        if(!dojox.dtl.filter.strings._truncatewords.test(current)){ 
          ++count; 
          if(count == arg){ 
            return value.substring(0, j + 1); 
          } 
        } 
      }else if(!dojox.dtl.filter.strings._truncatewords.test(current)){ 
        j = i; 
      } 
      last = current; 
    } 
    return value; 
} 

:

function truncate(value,arg) { 
    var value_arr = value.split(' '); 
    if(arg < value_arr.length) { 
     value = value_arr.slice(0,arg).join(' '); } 
    return value; 
} 

과 그 차이점은 무엇입니까?

답변

0

찾고있는 코드는 장고 템플릿 언어를 지원하는 dtl 라이브러리에서 가져온 것입니다. (http://www.dojotoolkit.org/book/dojo-book-0-9/part-5-dojox/dojox-dtl). 나는 거기에있는 코드가 스트레이트 문자열 분할을하는 것이 아니라 그들이 사용하고있는 템플릿을 파싱하는 것이라고 확신한다.

또한 정규식을 보면 공백보다 많은 시나리오를 처리하고 있습니다 ... 예를 들어, <. *?>은 여는 태그와 닫는 태그로 묶인 단어 그룹이 "워드".

+0

그래, 나는 장고 포트에 대해서도 자바 스크립트 용으로 작업하고 있는데, dojo의 dtl은 아이디어와 코드를 얻을 수있는 좋은 장소라고 생각했다. 왜 html/xml 태그가 단어로 간주 될지 궁금합니다. 일반적으로 문자열을자를 때 더 많은 링크가있는 요약을 보여주고 싶습니다. –

+0

나는 그곳에서 코드를 어떻게 사용하고 있는지 말할 수 없습니다 ... 당신의 목적을 위해서, 그것은 의미가 있습니다. 하지만 정규식이 그들을 포함하고 있기 때문에, 나는 그것의 유효하다고 생각합니다. 아마도 템플릿 미리보기 일종의 템플릿의 첫 번째 X 단어를 표시하는 것일까 요? 거기에 더 많은 시간을 보내지 않으면 확실하지 않습니다. dojo 메일 링리스트에 게시하면, 그들이 당신을 도울 수 있다고 확신합니다. – jvenema

3

분할은 공백 문자 시퀀스가 ​​단어 분리 기호임을 고려해야합니다. \s+과 같은 정규식을 사용해야합니다.

하지만 dojo의 코드는 엔티티와 xml 태그를 단어로 간주합니다. 문자열에 이런 일이 없다는 것을 알고 있다면 구현이 트릭을 수행 할 수 있습니다. 슬라이스가 발견 된 단어의 수를 초과하지 않는다는 점에주의하십시오. 약간의 점검이 필요할 수 있습니다.

0
  1. function 선언이 아마도 자바 스크립트 객체이며, function_name: function(params) {...를 사용하여 전역에서 자바 스크립트를 유지하는 데 도움이됩니다.
  2. arg 변수를 검사하여 정수가 전달되도록합니다. parseInt()을 사용하면 10"10"을 모두 허용합니다.
  3. 이 메서드는 사용되는 정규식에 의해 공백보다 더 많은 구분 기호를 처리 할 수 ​​있습니다.
  4. 이 코드는 배열 오버플로에 안전합니다. value에 8 단어 만 있으면 10을 셀 수 없습니다. 그렇지 않으면 배열 범위를 벗어나거나 객체가 존재하지 않는 오류가 발생합니다.
+0

물론, 그들은 parseInt (arg, 10)를 사용해야합니다 ... – Greg

0

정규식 3 부

  1. &이다. *?; .? 문자 엔터티 (같은 &)
  2. < 일치합니다 *> 꺽쇠 괄호로 일을 일치합니다 ([w \ -] \ w *)
  3. 문자열 [A-ZA-Z0-9_]로 시작하고 일치합니다 대시로 뒤따라 오는 것

그것은 공간에서 단지 쪼개지고있는 것이 아니다. 그것은 단어의 일부가 될 수 있다고 생각하는 것을 찾고, 그렇지 않은 것을 발견하면 단어 수를 올립니다.

쉼표 또는 파이프 구분 목록을 사용하고 공백으로 구분 된 목록과 함께 작동해야합니다.

+0

위에서 귀하의 의견과 의견을 읽은 후 더 나은 솔루션을 위해 dojo의 정규 표현식을 사용하여 시도했습니다. 문제는 문자열이 비 라틴 문자로 작성된 경우 dojo로자를 수 없다는 것입니다. (당신이 말했듯이, \ w는 a-zA-Z 문자들만 일치합니다). 내 새로운 방법은 다음과 같습니다. ... var value_arr = value.match (/ (. +? ([^ \ -] (? = \ s |,)))/g); if (value_arr && length

관련 문제