2009-08-04 6 views
5

저는   등의 html 특정 문자를 포함 할 수있는 텍스트로 입력 값을 설정하는 자바 스크립트를 사용하고 있습니다. 따라서이 값과 일치하는 정규식을 찾으려고합니다. 적절한 값 ("&", " ")으로 대체하면 정규식을 알아낼 수 없습니다. 여기 내가하려는 일이있다. 객체 (가) 대체 값에 일치 및 참조 포함되어 있는지 확인 : 내 문자열을 일치 시키려면, 다음자바 스크립트 정규식은 html 문자를 대체합니다

 
var specialChars = { 
    " " : " ", 
    "&" : "&", 
    ">" : ">", 
    "&lt;" : "<" 
} 

을 나는 시도

 
var stringToMatch = "This string has special chars &amp; and &nbsp;" 

 
stringToMatch.replace(/(&nbsp;|&)/g,specialChars["$1"}); 

같은 하지만 작동하지 않습니다. 나는 특별한 태그를 붙잡고 그것을 대체하는 방법을 정말로 모른다. 어떤 도움이라도 대단히 감사합니다.

+0

아마도 "& NBSP;"  이 표시됩니까? – lance

+0

왜 이스케이프를 사용하지 않습니까? http://www.w3schools.com/jsref/jsref_escape.asp – Joel

+0

탈출하면 &이 % 26amp % 3B가됩니다. 확실히 내가 뭘 찾고있는 건지 – brad

답변

15

약간 다른 주제 (Efficiently replace all accented characters in a string?)에서 질문의 기능을 사용할 수 있다고 생각합니다.

제이슨 멧새의 대답은 여기에 몇 가지 좋은 아이디어 +에게 필요한 설명을 가지고 당신이 도움을 찾아이 본질적으로 자신의 코드로,뿐만 아니라 자신의 원래의 대답을 upvote에 경우에 당신이 시작하는 일부 수정 (과의 솔루션입니다).

var stringToMatch = "This string has special chars &amp; and &amp;nbsp;"; 
var stringOutput = replaceHtmlEntites(stringToMatch); 

번호가 entites도 쉽게, 당신은 훨씬 더 일반적으로 약간의 수학 및 String.fromCharCode()를 사용하여 교체 할 수 있습니다

var replaceHtmlEntites = (function() { 
    var translate_re = /&(nbsp|amp|quot|lt|gt);/g, 
     translate = { 
      'nbsp': String.fromCharCode(160), 
      'amp' : '&', 
      'quot': '"', 
      'lt' : '<', 
      'gt' : '>' 
     }, 
     translator = function($0, $1) { 
      return translate[$1]; 
     }; 

    return function(s) { 
     return s.replace(translate_re, translator); 
    }; 
})(); 

호출.


또 다른, 훨씬 더 간단 가능성이

function replaceHtmlEntites(string) { 
    var div = document.createElement("div"); 
    div.innerHTML = string; 
    return div.textContent || div.innerText; 
} 

replaceHtmlEntites("This string has special chars &lt; &amp; &gt;"); 
// -> "This string has special chars < & >" 
+0

그래서 분명히 정규 표현식을 이해하지 못한다. 코드는 나에게 꽤 잘 보였지만 실제로 함수에 전달되는 값은 전체를 포함한다.   nbsp뿐만 아니라 괄호는 어쨌든, 전체 " ", "&"등을 포함하도록 객체를 변환하는 modding이 작동했습니다. 그렇지 않으면 정의되지 않은 값이 반환되었습니다. 감사합니다 – brad

+0

이 문제를 해결할 수 있도록 약간의 수정이있었습니다. 원래 코드로 시도한 것 같습니다. 위의 작품은 나를 위해, 나는 그것을 (다시) 시도했습니다. – Tomalak

+0

정말요? 아니요. 코드를 복사하고 디버거를 통해 실행했습니다. 전달되는 값은  입니다. 매우 이상합니다. 사파리를 사용하고 있으며 Firefox에서 테스트했습니다. 다른 브라우저를 사용해 보겠습니다. 어쨌든 다시 감사합니다 – brad

1

당신은 당신이 원하는 일을 할 수있는 기능을 기반으로 교체를 사용할 수 있습니다

var myString = '&'+'nbsp;&'+'nbsp;&tab;&copy;'; 
myString.replace(/&\w+?;/g, function(e) { 
    switch(e) { 
     case '&nbsp;': 
      return ' '; 
     case '&tab;': 
      return '\t'; 
     case '&copy;': 
      return String.fromCharCode(169); 
     default: 
      return e; 
    } 
}); 

을 그러나, 나는 상황을 고려하도록 촉구 않습니다. & nbsp; 및 & 사본; 및 기타 HTML 엔터티를 텍스트 값으로 바꾸려면 정말 바꾸시겠습니까? 나중에 그들을 개조해야합니까?

명심할 사항.

건배!

+1

이것은 위의 허용 된 대답보다 훨씬 간단합니다. 또한 더 많은 엔티티가 목록에 추가되면 더 확장 될 것이라고 생각합니다. 이는 명명 된 엔티티 목록이 SUPER long이므로 중요합니다. – Toby

+1

나는 포인트를 얻지 못했다. 나는 질문에 답한다.하지만 감정에 감사한다. :) 디폴트 케이스는 줄 바꾸기가 아니라 e를 반환해야한다는 사실도있다. – coderjoe

2

또 다른 방법은 그 다음에 텍스트를 할당 사업부 객체

var tmp = document.createElement("div"); 

을 만드는 것 (모든 브라우저에서 작동) 같은 것 그 innerHTML

tmp.innerHTML = mySpecialString; 

그리고 마지막 요소의 텍스트 내용

var output = tmp.textContent || tmp.innerText //for IE compatibility 

그리고 거기 당신이 가서 읽기 ...

+0

입력 (W/jquery) 값을 설정하기 위해 텍스트를 사용하고 있습니다. $ (입력) .val (someText) 대체가 필요한 someText입니다 – brad

+0

알겠습니다. 내가 제안한 것을 수행하면 "textContent"또는 "innerText"속성에 "결과 텍스트"가 있기 때문에 모든 값이 브라우저의 HTML 엔진에 의해 변환됩니다. – BYK

관련 문제