JavaScript regexp frisst string :o

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
328
hallo
ich habe einen string, aus dem ich bb-code tags entfernen will.
aus '
' soll zb 'url' werden. dazu verwende ich folgenden code:
Code:
var bbcodes = new Array("img");
var textneu = htmlelement.innerHTML;
          for (var i=0;i<bbcodes.length;i++){
            var reg = new RegExp('\\['+bbcodes[i]+'\\]','gi');
            textneu = textneu.replace(reg,'');
            reg = new RegExp('\\[\/'+bbcodes[i]+'\\]','gi');
            textneu = textneu.replace(reg,'');
          }
htmlelement.innerHTML = textneu;
das problem hierbei ist, dass der text zwischen den tags auch weg ist.
aus 'a
c' wird 'a c'

wo liegt der fehler?

Edit : das problem hat sich gerade in luft aufgelöst, und ich hab nix gemacht :o
funktioniert jetzt wie es soll^^
Ergänzung ()

ok. das problem tritt jetzt wieder auf :/
jetzt im konkreten fall wird aus
Code:
[ img]http://www.url.abc[ /img] [ b][ u][ size=24][ color=#0000FF]text[ /color][ /size][ /u][ /b] [ b][ u][ size=24][ color=#0000FF]text[ /color][ /size][ /u][ /b] 
( die leerzeichen in den tags sind nur, damit hier das forum die nicht interpretiert)
nur
Code:
http://www.url.abc
-.-

mein code sieht mittlerweile so aus:
Code:
          function killBB(){
            var bbcodes = new Array("img","url","b","i","u","s","sub","sup","size","font","align","color");
            var allytab = document.getElementsByTagName("tbody")[0];
            var allytexttd = allytab.getElementsByTagName("tr")[3].getElementsByTagName("td")[1];
            var allytext = allytexttd.innerHTML;
            var textneu = allytext;
            for (var i=0;i<bbcodes.length;i++){
              if (i<=7){
                var reg = new RegExp('\\['+bbcodes[i]+'\\]','gi');
                textneu = textneu.replace(reg,'');
                var reg = new RegExp('\\[\/'+bbcodes[i]+'\\]','gi');
                textneu = textneu.replace(reg,'');
              }else{
                var reg = new RegExp('\\['+bbcodes[i]+'=(.+)\\]','gi');
                textneu = textneu.replace(reg,'');
                var reg = new RegExp('\\[\/'+bbcodes[i]+'\\]','gi');
                textneu = textneu.replace(reg,'');
              }              
            }
            textneu = textneu.replace(/(http:\/\/.+)/gi,'<b><a href="$1">$1<\/a><\/b>'); // urls in html-links umwandeln
            allytexttd.innerHTML = textneu;
          }          

          var button = document.createElement("button");
          button.id = 'allybutton';
          button.textContent = 'Entferne BB-Code';
          button.style.marginLeft = '10px';
          getElementsByClass("content")[2].insertBefore(button,getElementsByClass("content")[2].firstChild);
          document.getElementById("allybutton").addEventListener('click',killBB,true);
 
Zuletzt bearbeitet:
Probier mal folgende RegEx (hier img Tag als Beispiel):

Code:
/\[img\](.*?)=\1\[\/img\]/

die anderen Tags dann entsprechend.
Musste halt noch an deine Array-Struktur anpassen.

Gruß
Mistalan
 
Zuletzt bearbeitet:
verrätst du mir noch, was (.*?)=\1\ macht?

ich hab auch schon mehrere möglichkeiten ausprobiert zb
Code:
textneu = textneu.replace(/\[img\](.+)\[\/img\]/gi,'$1');
nur bei font und/oder size wird dann mehr entfernt als es soll

hab auch schon probiert :
Code:
textneu = textneu.replace(/\[(img|url|b|i|u|s|sub|sup|font=.+|color=.+|align=.+|size=.+)*?\]/gi,''); // start tags entfernen
textneu = textneu.replace(/\[\/(img|url|b|i|u|s|sub|sup|font|color|align|size)*?\]/gi,''); //schluss tags entfernen
einzelnen funktioniert der code richtig, aber wenn ich sowohl anfang als auch ende ersetze, wird wieder mehr entfernt :/
 
Hier mal eine mögliche Lösung für das Problem. Habs mit deinem Beispielstring getestet, also
Code:
[ img]http://www.url.abc[ /img] [ b][ u][ size=24][ color=#0000FF]text[ /color][ /size][ /u][ /b] [ b][ u][ size=24][ color=#0000FF]text[ /color][ /size][ /u][ /b]
Und es werden alle Inhalte richtig herausgeholt:

Code:
var bbcodes = new Array("img","b","u","size","color");

var alltags = bbcodes.join("|");
var stripbb = new RegExp('\\[\/?('+ alltags + ')[^\\]]*\\]','gi');

textneu = textneu.replace(stripbb, "");

Leicht abgewandelt von http://stackoverflow.com/questions/847947/regex-to-strip-bbcode/848002#848002

Ins Array bbcodes musst du alle zu ersetzenden Code-Tags reinschreiben.
Wobei der Regex allerdings versagt sind eckige Klammern in denen der Inhalt zufällig mit einem der BBCodes beginnt, also [beispiel] wird rausgeschmissen. Durch die Verwendung von 'gi' werden beim ersten Durchlauf schon alle Vorkommnisse ersetzt, es ist also keine Schleife notwendig. Außerdem werden sowohl öffnende als auch schließende Tags ersetzt.

Grüße

Denara
 
danke für deine hilfe.
ich hab jetzt auch wohl den fehler gefunden bei mir. '=.+' hat wohl mehr erkannt, als es sollte.
das habe ich jetzt durch '=\S+' ersetzt und es funktioniert einwandfrei.

also mein code sieht jetzt letztendlich so aus:
Code:
textneu = textneu.replace(/\[(img|url|b|i|u|s|sub|sup|font=\S+|color=[#]?[a-zA-Z0-9]+|align=\S+|size=\S+)*?\]/gi,'');
textneu = textneu.replace(/\[\/(img|url|b|i|u|s|sub|sup|font|color|align|size)*?\]/gi,'');
 

Ähnliche Themen

Zurück
Oben