2009-08-04 25 views
5

Bir girdinin değerini, html'ye özgü karakterleri içeren bir girişle ayarlamak için javascript kullanıyorum &  vb. Bu değerlerle eşleşen bir regex bulmaya çalışıyorum. bunları sırasıyla uygun değerle değiştirin ("&", " "), sadece bunu yapmak için normal ifadeleri anlayamıyorum. İşte yapmaya çalıştığım şey. Bir nesne yedek değerine eşleşmeleri ve başvuru içerdiğinden emin olun: Ben dizeyle eşleşen istiyorum Sonrajavascript regex html karakterlerini değiştirin

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

denedim

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

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

gibi bir şey ama işe yaramıyor. Özel etiketi nasıl yakalayacağımı ve değiştirmeyi gerçekten anlamıyorum. Herhangi bir yardım büyük beğeni topluyor.

+0

Belki "& nbsp;" senin   gösterecek? – lance

+0

Neden kaçmak istemiyorsunuz? http://www.w3schools.com/jsref/jsref_escape.asp – Joel

+0

çıkış,% 26amp% 3B'ye & dönüştürebilir. Kesinlikle ben – brad

cevap

15

Biraz farklı bir konuda (Efficiently replace all accented characters in a string?) bir sorudan fonksiyonları kullanabilirsiniz.

Jason Bunting cevabı burada, bazı güzel fikirler + gerekli açıklaması var sen bunu yararlı buluyorum bu temelde, onun kod olduğu gibi, aynı zamanda kendi özgün cevabı upvote eğer başlamak için bazı değişikliklerle (ile yaptığı çözüm).

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

Numaralı entites daha kolay olduğu gibi, çok daha genel olarak biraz hesap ve String.fromCharCode() kullanarak bunları değiştirebilirsiniz

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); 
    }; 
})(); 

çağrılabilir.


Başka, daha basit olasılık

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

Yani görünüşe göre ben regex'in anlamıyorum.Kodun bana oldukça iyi görünüyordu, ama işleve geçirilen değer (ler) aslında tüm   içeriyor. Sadece nbsp değil. İçinde chars? Neyse, tüm " ", "&" vb. içerecek şekilde çevirme nesnesini çalıştırarak çalıştı, aksi halde sadece undefined döndü.Teşekkürler – brad

+0

Cevap, bunun için uyum sağlamak için biraz değiştirildi. Orijinal kod ile denedin sanırım. Yukarıdaki işler benim için, sadece denedim (tekrar). – Tomalak

+0

Gerçekten mi? Hayır, kodunuzu kopyaladım ve hata ayıklayıcısından çalıştırdım, (lerin) içinde geçirilmem için değeri   idi. Çok tuhaf. Safari kullanıyorum ve Firefox'ta test ettim. Diğer birkaç tarayıcıyı da deneyeceğim. Tekrar teşekkürler – brad

1

Sen ne yapmak istediğinizi yapmak için bir fonksiyon tabanlı değiştirme kullanabilirsiniz:

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; 
    } 
}); 

Ancak, durumunuzu dikkate çağırıyorum yoktur. & nbsp alıyorsanız; ve & kopya; ve metin değerlerinizdeki diğer HTML öğeleri, bunları gerçekten değiştirmek ister misiniz? Onları sonradan dönüştürmelisin mi?

Sadece akılda tutulması gereken bir şey.

Şerefe!

+1

için arıyorum Ne bu daha önce kabul edilen cevap daha basittir.Ayrıca, daha varlıklar listeye eklenir gibi daha iyi ölçekleyeceğine inanıyorum, bu yana adlandırılmış varlıkların listesi SÜPER uzun olduğu için önemlidir. Soygunlu bir oğlun var! – Toby

+1

Puanlar için bu işe yaramadım. Soruların içindeyim. Ama duygular için teşekkürler. :) Ayrıca, varsayılan durumun, e değil, geri dönüş olması gerektiği de var. – coderjoe

2

bir başka yolu Sonra metin atama div nesnesi

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

oluşturmak olacaktır (herhangi bir tarayıcıda çalışır) böyleolacağını onun iç html Ve nihayet elemanın metin içeriğini

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

Ve işte oldu okurken ...

+0

Bir girdi (w/jquery) değerini $ (giriş) .val (someText) olarak ayarlamak için metni kullanıyorum. – brad

+0

Değiştirilmesi gereken bir metin var. Önerdiğim şeyi yaptığınızda, "textContent" veya "innerText" özelliği "sonuç metin" içerdiğinden, tüm değerler tarayıcının HTML motoru tarafından dönüştürülür. – BYK