JQuery: Traversieren mit Bedingungen

Ich such von einem Element ausgehen ein übergeordnetes Element der gleichen Art. Dabei können bestimmte Elemente dazwischen sein, andere aber nicht, so dass die Suche hier abgebrochen wird.
Ich komme dabei weder mit parents(), noch mit parentsuntil() zurecht

Beispiele:

Lorem ipsum <b>dolor sit <i>amet</i>, consetetur sadipscing <b>elitr</b>, sed diam nonumy eirmod tempor invidunt ut labore et dolore</b> magna aliquyam erat, sed diam voluptua.
<div>Lorem ipsum <b>dolor sit <i>amet</i>, consetetur </b></div>sadipscing <b>elitr</b>, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

Im ersten Beispiel möchte ich von „elitr“ ausgehend den äußeren b-wrap ansprechen.
Im zweiten Fall gibt es kein Ergebnis, da von „elitr“ ausgehend kein übergeordnetes b mehr auftaucht bzw. dies in einem als „unzulässiges“ Element (div) auftaucht.

Wie gesagt, manche Elemente sollen die Suche nach oben nicht stören (hier i) und andere sollen die Suche nach oben abbrechen (hier div).

Du solltest auch kein in einem verschachteln.

Davon abgesehen stellen und Nodes dar. Nodes sind immer parents, siblings oder children eines anderen Elements, und über diese kann man natürlich traversieren. Wenn du jetzt aber anfängst, das zweite im dritten child des übernächsten

zu suchen, dann kann bereits eine kleine Änderung der HTML-Struktur deine Funktion platzen lassen. Anstatt derart instabilen Code zu schreiben, würde ich lieber mit eindeutigen Selektoren arbeiten.

Das ist ja genau der Punkt. Ich möchte eben nicht, dass solche unsinnigen Verschachtelungen entstehen. Ich möchte nämlich genau diese entfernen.
Deshalb war mein Ansatz eben, dass ich nach oben den gleichen Tag suche. Ist er vorhanden, so ist der Code einfach schlecht und ich kann den Tag, von dem ich ausgehe löschen, da bereits vorher schon ein b-Tag vorliegt.

Aber ich fürchte schon, dass das der falsche Ansatz ist…

Ich finde den Ansatz nicht gut.

if ( $('b').closest('b').length ) { $('b').closest('b').unwrap(); }

Was wäre denn dein Vorschlag?

Mein Vorschlag wäre, auf semantisch falsche Verschachtelungen und instabiles Traversieren zu verzichten. Ansonsten habe ich dir oben einen Ansatz gezeigt. Per While Schleife sollte das sogar mit einer beliebig tiefen Hierachie funktionieren. Schön wird es dadurch aber trotzdem nicht.

Ok, danke. Ich werde es denke ich nochmal neu aufsetzen - in der Hoffnung, dass es besser wird.

Eine letzte Frage noch zu diesem Thema:
Wie kann ich alle div-Tags entfernen (Start und End-Tags), die keinerlei Attribute aufweisen (keine Klassen oder ähnliches)?
Da die End-Tags grundsätzlich alle leer sind, kann ich schlecht mit replace und einem regex arbeiten, oder?

Also so etwas in der Art…

 $('div:not([class])').unwrap(); 

Allerdings soll das nicht für das gesamte Dokument gelten, sondern nur für den Inhalt von dem container mit der id „aufraeumen“.

Aber so ist es ja Quatsch…

$('#aufraeumen').$('div:not([class])').unwrap();

Mal so versuchen? Ich nehme für try und error immer die Konsole:

$('#aufraeumen').find($('div:not([class])').unwrap();

Falls hier nur das erste Element gefunden wird, würde ich über each() iterieren.

Irgendwie scheint das aber nicht zu funktionieren:
http://jsfiddle.net/R7cvq/

Wenn ich die Klasse „irgendwas“ angebe, dann wird der darüberliegende Container entfernt, anstatt des Containers „irgendwas“.
Wenn ich die darüberliegende Klasse angebe, funktioniert es gar nicht mehr und wenn ich alle leeren Divs angebe, auch nicht.
Was übersehe ich da?