2014-06-15 4 views
17

JavaScript가 매우 녹슬어서 어떤 도움이 될 수 있습니다. 나는 인쇄 할 수없는 문자 (SOH, BS 등의 제어 문자)를 감지하여 문자열의 Ž과 같은 ascii 문자를 확장하고 제거하는 요구 사항이 있지만 코드를 작성하는 방법을 모르겠습니다.인쇄되지 않는/ASCII 이외의 문자와 일치하고 텍스트에서 제거하십시오.

누구든지이 문제를 해결하는 방법에 대해 올바른 방향으로 나를 가리킬 수 있습니까? 당신은 그것을 일치하는지 확인하기 위해 test()를 사용 후, isNonAscii 변수에 (대신 문자열) 패턴을 할당해야

$(document).ready(function() { 
    $('.jsTextArea').blur(function() { 
     var pattern = /[^\000-\031]+/gi; 
     var val = $(this).val(); 
     if (pattern.test(val)) {  
     for (var i = 0; i < val.length; i++) { 
      var res = val.charAt([i]); 
       alert("Character " + [i] + " " + res);    
     }   
    } 
    else { 
     alert("It failed"); 
    } 

    }); 
}); 
+0

(주 나는 아직도 아직 누군가가 그 좋은 것 할 수있는 방법을 지적 할 수 그래서 만약, 새로운 수정 inString 값으로 텍스트 상자를 다시 채워야하는 방법을 알아 내기 위해 관리하지 않은 경우) 'match' 속성은'isNonAscii.match ($ (this) .val())'처럼 호출되어야합니다. 이 프로그램은 마술처럼 입력 값을 정규식과 일치시키고 싶지는 않습니다. – SeinopSys

+0

입력 해 주셔서 감사합니다. 의미가 있지만 어떻게 텍스트 상자의 문자열에서 감지 된 잘못된 문자를 제거합니까? –

+1

나는 이것에 대한 나의 접근 방식을 바꾸고 서버 측 솔루션으로 가기로 결정했다. (자바 스크립트는 때때로 클라이언트 브라우저에서 꺼질 수 있기 때문에) –

답변

-5

:

public static string RemoveTroublesomeCharacters(string inString) 
{ 
    if (inString == null) 
    { 
     return null; 
    } 

    else 
    { 
     char ch; 
     Regex regex = new Regex(@"[^\u0000-\u007F]", RegexOptions.IgnoreCase); 
     Match charMatch = regex.Match(inString); 

     for (int i = 0; i < inString.Length; i++) 
     { 
      ch = inString[i]; 
      if (char.IsControl(ch)) 
      { 
       string matchedChar = ch.ToString(); 
       inString = inString.Replace(matchedChar, string.Empty); 
      } 
     } 

     while (charMatch.Success) 
     { 
      string matchedChar = charMatch.ToString(); 
      inString = inString.Replace(matchedChar, string.Empty); 
      charMatch = charMatch.NextMatch(); 
     } 
    }  

    return inString; 
} 

내가 그것을 무너 뜨리는거야 경험이 적은 사람들을 위해 좀 더 세부 사항 :

  1. 우리 먼저 전체 문자열의 모든 문자를 통해 루프와 문자가 제어 문자인지 아닌지 결정하기 위해 문자의 IsControl이 방법을 사용합니다.

  2. 제어 문자가 발견되면 일치하는 문자를 문자열로 복사 한 다음 Replace 메서드를 사용하여 제어 문자를 빈 문자열로 변경하십시오. 린스하고 나머지 문자열을 반복합니다.

  3. 전체 문자열을 반복했으면 정의 된 정규 표현식 (제어 문자 또는 표준 ASCII 문자가 아닌 문자와 일치 함)을 사용하고 일치하는 문자를 빈 문자열로 다시 바꿉니다. while 루프에서이 작업을 수행한다는 것은 charMatch가 true이면 문자가 대체된다는 것을 의미합니다.

  4. 마지막으로 모든 문자가 제거되고 전체 문자열이 반복되면 inString을 반환합니다.

:

+2

당신은 여기에서 완벽하게 유효한 답을 얻을 수 있습니다. 또한 \ u0000 - \ u0020은 제어 문자입니다. –

1

: 이것은 내가 지금까지있는 것입니다. test()은 true 또는 false를 반환합니다.

$(document).ready(function() { 
    $('.jsTextArea').blur(function() { 
     var pattern = /[^\000-\031]+/gi; 
     var val = $(this).val(); 
     if (pattern.test(val)) { 
      alert("It matched"); 
     } 
     else { 
      alert("It did NOT match"); 
     } 
    }); 
}); 

확인 jsFiddle

+0

응답 해 주셔서 감사합니다.하지만 잘못된 문자를 감지하고 문자열에서 제거하고 텍스트 상자에 잘못된 문자가없는 새 문자열을 바꾸려면 어떻게해야합니까? –

+0

'replace()'함수를 사용하면 예상 한대로 작동합니다. 해당 코드 대신 직접 수행 할 수 있습니다. @ CasimiretHippolyte의 코드는 잘 작동합니다. – kosmos

26

테스트 할 필요가 없습니다, 당신은 직접 텍스트 상자의 내용을 처리 할 수 ​​있습니다 :

범위 \x20-\x7E는 아스키 테이블의 인쇄 부분을 커버
textBoxContent = textBoxContent.replace(/[^\x20-\x7E]+/g, ''); 

. 코드와

예 : 첫 번째 128 :

`[^ -~]+` 

설명 :

$('.jsTextArea').blur(function() { 
    this.value = this.value.replace(/[^\x20-\x7E]+/g, ''); 
}); 
+0

입력 해 주셔서 감사 합니다만 교체 기능은 인쇄 가능한 문자로만 작동하므로 작동하지 않습니다. BS, SOH, ACK 등의 제어 문자는 보이지 않으므로 .replace 메소드를 사용하여 선택하지 않습니다. –

+0

@GrantDoole : 무슨 미친 생각이야! 문자가 인쇄 가능하지 않기 때문에 replace 메소드가 그것을 찾지 못한다는 것을 의미하지는 않습니다! replace 메소드는 모든 문자 (인쇄 가능 여부)와 함께 작동합니다. –

+0

정말요? 방금 테스트했기 때문에 이상하지 않은가? 보여줄 수 있니? –

25

가 인쇄 기본 ASCII 범위의 일부가 아닌 문자를 대상으로 지정하려면, 당신은이 간단한 정규식을 사용할 수 있습니다 문자가 ASCII table 인 경우 인쇄 가능 범위는 공백 문자로 시작하고 물결표로 끝납니다. 이들은 당신이 지키고 싶은 캐릭터입니다. 이 범위는 [ -~]으로 표시되며 해당 범위에 포함되지 않은 문자는 [ -~]으로 표시됩니다. 이것들은 우리가 대체하기를 원하는 것들입니다. 따라서이 문제를 가지고 있고 솔루션 '을 모두 수정'...이 내가 결국 고정하는 방법이다 찾고있는 사람들을 위해

result = string.replace(/[^ -~]+/g, ""); 
+2

정말 더 간단합니다. –

+0

@CasimiretHippolyte 고마워, Caz. :) – zx81

+0

안녕하세요. 아주 좋은 답변이지만 모두 해결할 수 있습니다. value.replace가 잘 작동하는 동안, 내가 필요한 것만 정확하게은 아니다. 나는 지금까지 가지고있는 것으로 원래 게시물을 업데이트 할 것이다. –

관련 문제