2010-04-19 4 views
4

jQuery 플러그인을 작성할 때 CSS 간격에 대한 옵션을 지정하고 싶습니다. 객체의 값으로 CSS 문자열을 반환하는 함수를 작성했습니다.구문 분석 CSS 대책

5px 10px 반환 상단 : 5px 오른쪽 : 10px, 하단 : 5px은, 왼쪽 : 10px

지금 나는 종종 약간의 계산 등을 할 반환 된 값을 사용하여 매우 좋지 않아 모든 측정 단위를 추출해야합니다 시간 ... 나는 누군가가 나에게이 기능을 완료하는 데 도움 수있는 정규 표현식을 서면으로 빨아

:

어떻게이 기능을 개선하는 방법 나는 당신의 의견에 열려입니다 어떤 생각이있는 경우
this.cssMeasure = function(cssString, separateUnits){ 

    if (cssString){ 
     var values = {} 
    }else{ 
     return errorMsg 
    } 

    var spacing = cssString.split(' ') 
    var errorMsg = 'please format your css values correctly dude' 

    if(spacing[4]) { 
     return errorMsg 
    } else if (spacing[3]) { 
     values = {top: spacing[0], right:spacing[1], bottom:spacing[2], left:spacing[3]} 
    } else if (spacing[2]) { 
     values = {top: spacing[0], right:spacing[1], bottom:spacing[2], left:spacing[1]} 
    } else if (spacing[1]) { 
     values = {top: spacing[0], right:spacing[1], bottom:spacing[0], left:spacing[1]} 
    } else { 
     values = {top: spacing[0], right:spacing[0], bottom:spacing[0], left:spacing[0]} 
    } 

    if (separateUnits) { 
     $.each(values, function(i, value){ 
      /* 
      at this place i need to extract the measuring unit of each value and return them separately 
      something like top: {value: 10, unit: 'px'}, right: {bla} and so on 
      */ 
     }) 
    } 

    return values 

} 

.

+1

세 개의 값 (예 : "10px 5px 7px")는 완벽하게 유효합니다. 첫 번째 값은 위쪽, 두 번째 값은 왼쪽 및 오른쪽, 세 번째 값은 아래쪽 값입니다. – outis

+0

와우 알아두면 좋은데, 나는 그 글을 편집했다. – meo

답변

4

http://www.w3.org/TR/css3-values/#ltnumbergt에 따르면, "다수의 하나의 정수일 수 있고, 또는 하나 개 이상의 숫자 뒤에 도트 (.) 뒤에 0 이상의 숫자 일 수있다"정규 표현식 언어,

\d+|\d*\.\d+ 

의 그것에 선택적 부호를 추가하고 그룹 "비 캡처는"할 수 있도록하자 때문에 장치가 어떤 순서가 될 지루하게 모든 가능한 장치를 열거 간단

([+-]?(?:\d+|\d*\.\d+)) 

를 구문 분석 소문자 (없음 포함하지 않음) 문자 또는 퍼센트 기호의

([a-z]*|%) 

propRe = /^([+-]?(?:\d+|\d*\.\d+))([a-z]*|%)$/ 

당신이

parts = "+12.34em".match(propRe) 

숫자 값이 될 것 값으로 적용하면, 모두 함께 퍼팅 부품 [1]과 부품 단위 [2]

2
switch (spacing.length) { 
case 1: 
    values = {top: spacing[0], right:spacing[0], bottom:spacing[0], left:spacing[0]}; 
    break; 
case 2: 
    values = {top: spacing[0], right:spacing[1], bottom:spacing[0], left:spacing[1]}; 
    break; 
case 3: 
    values = {top: spacing[0], right:spacing[1], bottom:spacing[2], left:spacing[1]}; 
    break; 
case 4: 
    values = {top: spacing[0], right:spacing[1], bottom:spacing[2], left:spacing[3]}; 
    break; 
default: 
    return errorMsg; 
} 

if (separateUnits) { 
    values = $.map(values, function(i, value){ 
     matches = value.match(/([-+]?[\d.]*)(.*)/); 
     return {value: matches[1]+0, 
       unit: matches[2] ? matches[2] : 'px'}; 
    }) 
} 
+0

케이스 솔루션이 확실히 좋습니다. 하지만 단위가 px가 아니라 em 또는 %이면 어떻게 될까요? 그리고 "?" (matches [2]? matches [2]) – meo

+1

유닛 그룹'(. *)'은 모든 문자와 일치합니다. 특히 첫 번째 그룹은 모든 자릿수와 일치하고 나머지 문자는 단위가됩니다. '? '는 혼자가 아닙니다. 이것은 고독한 삼항 연산자'':''의 일부입니다. 'if-else'와 같지만 성명보다는 표현식입니다. 값에 유효한 단위가 있는지 확인합니다. 단위가 지정되지 않으면 단위는 'px'로 기본 설정됩니다. 자세한 내용은 "3 자"를 검색하십시오. – outis