Hanuchin: Reguläre Ausdrücke - String Replace mit Ausnahmen

Hallo,

ich möchte folgendes Umsetzen:
Alle Vorkommnisse von einem String innerhalb eines DOM Objekts sollen ausgetauscht werden, außer es befindet sich in einem Attribut-Wert.

Es existiert ein HTML Gerüst:

  
<div id="body>  
  <div class="mod">  
    <h2>Lorem ipsum</h2>  
    <p>ipsum dolore,.... </p>  
  </div>  
  <div class="mod">  
    <h2>Lorem ipsum</h2>  
    <a href="#" title="Lorem ipsum">Linkbezeichnung</a>  
    <p>ipsum dolore,.... </p>  
  </div>  
  ....  
</div>  

In dem HTML Gerüst will ich nun sagen, tausche "ipsum" gegen "Blindtext", aber nur dann, wenn es sich nicht in einem Attribut in dem Fall title="" befindet.

Funktioniert sowas?

Das Austauschen alleine ist recht simpel:
var srcTerm = "ipsum"
var destTerm = "Blindtext"
var str = $("#body").html();
$("#body").html(str.replace(new RegExp(srcTerm,"gi"), '<em class="term">' + destTerm + '</em>'));

Ich hab nun versucht, mit der Beschränkung ?! zu arbeiten, aber ich verstehe es anscheinend nicht wirklich.

Muss noch sagen, dass ich mit jQuery 1.4 arbeite.
danke!
Hanu

  1. Hi,

    ich möchte folgendes Umsetzen:
    Alle Vorkommnisse von einem String innerhalb eines DOM Objekts sollen ausgetauscht werden, außer es befindet sich in einem Attribut-Wert.

    Was du eigentlich möchtest, ist also nur den Inhalt von Textknoten im DOM betrachten, und darin ggf. etwas auszutauschen?

    Funktioniert sowas?

    Reguläre Ausdrücke sind dafür nur schlecht geeignet.
    Das DOM rekursiv zu durchlaufen, und dabei die TextNodes zu untersuchen, ist m.E. der bessere Weg.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Was du eigentlich möchtest, ist also nur den Inhalt von Textknoten im DOM betrachten, und darin ggf. etwas auszutauschen?

      Funktioniert sowas?

      Reguläre Ausdrücke sind dafür nur schlecht geeignet.
      Das DOM rekursiv zu durchlaufen, und dabei die TextNodes zu untersuchen, ist m.E. der bessere Weg.

      Das scheint sinnvoll. Gibts dazu vielleicht ein Beispiel? Hab den DOM noch nicht derart durchsucht.

      Danke

      MfG ChrisB

      1. Hi,

        Das scheint sinnvoll. Gibts dazu vielleicht ein Beispiel? Hab den DOM noch nicht derart durchsucht.

        Da gibt's diverse Ansätze - http://www.google.com/search?q=getalltextnodes

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hier noch meine Lösung:

          Es gibt nun eine jQuery Funktion, mit der ich alle Textnodes, welche den Suchbegriff enthalten, als Array erhalte:

            
          jQuery.fn.egrep = function(term) {  
           var out = [];  
           var textNodes = function(n) {  
            if (n.nodeType == 3) {  
             var t = typeof term == 'string' ?  
              n.nodeValue.toLowerCase().indexOf(term.toLowerCase()) != -1 :  
              term.test(n.nodeValue);  
             if (t) {  
              out.push(n.parentNode);  
             }  
            }  
            else {  
             jQuery.each(n.childNodes, function(a, b) {  
              textNodes(b);  
             });  
            }  
           };  
           this.each(function() {  
            textNodes(this);  
           });  
           return out;  
          };  
          
          

          Hier wird die Funktion aufgerufen und bei den jeweiligen Textnodes mach ich dann ein Replace, um den Suchbegriff entsprechend zu markieren bzw mit einem Tag zu versehen:

            
          var searchTermArray  = searchTerm.split(",");  
          for (var i = 0; i < searchTermArray.length; ++i) {  
          	var n = $("#body, #stage").egrep(searchTermArray[i]);  
          	for (var j = 0; j < n.length; ++j) {  
          		void($(n[j]).html( $(n[j]).html().replace(new RegExp("(" + searchTermArray[i] + ")","gi"), '<em class="search-term">$1</em>') ) );  
          	}  
          }  
          
          

          Danke nochmal an ChrisB

          Baba Hanu