2016-04-08 19 views
3

Düzenli ifadelerin yeni kullanıcılarından biriyim, yalnızca gerekli (src/href/style) özniteliğini değerleriyle tutarak ve gereksiz öznitelikleri ortadan kaldırarak HTML etiketlerini filtrelemeye çalışıyorum. Googling ederken sadece "src" özelliğini tutmak için normal bir ifade buldum, dolayısıyla benim değişmiş ifade aşağıdaki gibidir:Gereksiz öznitelikleri JavaScript'i kullanarak html etiketinden kaldırın. RegEx

<([a-z][a-z0-9]*)(?:[^>]*(\s(src|href|style)=['\"][^'\"]*['\"]))?[^>]*?(\/?)> 

Onun iyi çalışıyor ama bir etiketi sonra birden fazla gerekli öznitelik içeriyorsa Tek sorun ise, sadece son eşleşen tek özniteliği tutar ve kalanını atar. Aşağıdaki çıktıyı ikamesi dizesi olarak <$1$2$4> ile yukarıda belirtilen ifade kullanarak ve elde https://regex101.com/#javascript de şu metni

<title>Hello World</title> 
<div fadeout"="" style="margin:0px;" class="xyz"> 
    <img src="abc.jpg" alt="" /> 
    <p style="margin-bottom:10px;"> 
     The event is celebrating its 50th anniversary K&ouml;&nbsp; 
     <a style="margin:0px;" href="http://www.germany.travel/">exhibition grounds in Cologne</a>. 
    </p> 
    <p style="padding:0px;"></p> 
    <p style="color:black;"> 
     <strong>A festival for art lovers</strong> 
    </p> 
</div> 

temizlemeye çalışıyorum

:

<title>Hello World</title> 
<div style="margin:0px;"> 
    <img src="abc.jpg"/> 
    <p style="margin-bottom:10px;"> 
     The event is celebrating its 50th anniversary K&ouml;&nbsp; 
     <a href="http://www.germany.travel/">exhibition grounds in Cologne</a>. 
    </p> 
    <p style="padding:0px;"></p> 
    <p style="color:black;"> 
     <strong>A festival for art lovers</strong> 
    </p> 
</div> 

Sorun "tarzı" niteliği gelen atılır bağlantı etiketi. (\s(src|href|style)=['\"][^'\"]*['\"]) bloğunu * işlecini, {3} seçiciyi ve çok daha fazlasını boşa harcamayı denedim. Herhangi bir öneri ??? İşte

+0

Ben test için RegexBuddy kullanarak önerebilirsiniz ifade. Geçmişte bana çok zaman kazandırdı. https://www.regexbuddy.com/ –

+0

Referans için OP kodu https://regex101.com/r/mP0pX6/1 –

+1

adresinde bulunabilir. Neden RegEX yerine DOM manipülasyonunu kullanmıyorsunuz? –

cevap

4

@AhmadAhsan DOM işlemleri kullanarak sorununuzu çözmek için demo: https://jsfiddle.net/pu1hsdgn/

<script src="https://code.jquery.com/jquery-1.9.1.js"></script> 
    <script> 
     var whitelist = ["src", "href", "style"]; 
     $(document).ready(function() { 
      function foo(contents) { 
      var temp = document.createElement('div'); 
      var html = $.parseHTML(contents); 
      temp = $(temp).html(contents); 

      $(temp).find('*').each(function (j) { 
       var attributes = this.attributes; 
       var i = attributes.length; 
       while(i--) { 
        var attr = attributes[i]; 
        if($.inArray(attr.name,whitelist) == -1) 
         this.removeAttributeNode(attr); 
       } 
      }); 
      return $(temp).html(); 
     } 
     var raw = '<title>Hello World</title><div style="margin:0px;" fadeout"="" class="xyz"><img src="abc.jpg" alt="" /><p style="margin-bottom:10px;">The event is celebrating its 50th anniversary K&ouml;&nbsp;<a href="http://www.germany.travel/" style="margin:0px;">exhibition grounds in Cologne</a>.</p><p style="padding:0px;"></p><p style="color:black;"><strong>A festival for art lovers</strong></p></div>' 
     alert(foo(raw)); 
    }); 
    </script> 
1

orijinal regex dayalı gidin:

<([a-z][a-z0-9]*?)(?:[^>]*?((?:\s(?:src|href|style)=['\"][^'\"]*['\"]){0,3}))[^>]*?(\/?)> 

Grup 1 etiket adıdır, grup 2 nitelikleri vardır ve eğer varsa grup 3 / olduğunu. İzin verilen özniteliklerle araya girilen izin verilmeyen özniteliklerle çalışmaya başlayamadım. <a href="foo" class="bar" src="baz" />. Yapılabileceğini sanmıyorum.

Düzenleme: regex altında @ AhmadAhsan en düzeltmeler olmalıdır başına: Burada

<([a-z][a-z0-9]*)(?:[^>]*?((?:\s(?:src|href|style)=['\"][^'\"]*['\"]){0,3}))[^>]‌​*?(\/?)> 
+1

Tembel arama yerine '*?', etiket adı için aç olması gerekir '*' aksi takdirde 't' yerine 'title' yerine geri dönülür.Yükleme <$1$2$3> : <([az] [a-z0-9] *) (?: [^>] *? ((?: \ S (?: Src | href | style) = ['\ "] [^' \ "] * ['\"]) {0,3})) [^>] *? (\ /?)> İhtiyaçlarımı yerine getirmese de, başkaları için yararlı olabilir. –

+1

İşte deneme demosu: https://regex101.com/r/aE9sF8/2 –

+0

@AhmadAhsan Haklısınız. Sadece bir 'a' etiketi üzerinde test ettim. –

İlgili konular