webForumDet fria alternativet

Javascript replace

1 svar · 436 visningar · startad av Madoor

MadoorMedlem sedan sep. 200234 inlägg
#1

Har ett stort problem med en javascriptfunktion som ska hitta [table][/table] och ersätta den med sin like i HTML. Tyvärr verkar det vara fler än jag som inte förstår varför felet uppstår eftersom det hittills inte varit någon som kunnat hjälpa mig. Funktionen ser ut:

var myString = document.getElementById("form1").information.value;

var findReg = new RegExp ("\\[table(.*?)\\]([\\s\\S]*?)\\[/table\\]","gi");

myString = myString.replace(findReg, function($2,$1){return parseTable(1,$2,$1);});

function parseTable(type,texten,extraTag1)
{
	var extraTagAPP1 = "";
	var re = new Array;
	var myArray = new Array;
			
	if (type == 1)
	{
		if (extraTag1 != undefined && extraTag1 != '0' && extraTag1 != '')
		{
			var contentTables = new Array("cellspacing","cellpadding","border","width","height");
			var contentTablesValues = new Array('0','0','0','100%','');
			var contentTablesExtra = new Array('','','','px','px');
			re[re.length] = /cellspacing[\s]*?=[\s]*?([\d]{1,2})/i;
			re[re.length] = /cellpadding[\s]*?=[\s]*?([\d]{1,2})/i;
			re[re.length] = /border[\s]*?=[\s]*?([\d]{1,2})/i;
			re[re.length] = /width[\s]*?=[\s]*?([\d]{1,3})/i;
			re[re.length] = /height[\s]*?=[\s]*?([\d]{1,3})/i;
			for (x=0;x<re.length;++x)
			{
				myArray[x] = extraTag1.match(re[x]);
				if (myArray[x] != undefined)
					extraTagAPP1 += " "+contentTables[x]+"='"+myArray[x][1]+contentTablesExtra[x]+"'";
				else if (contentTablesValues[x] != "")
					extraTagAPP1 += " "+contentTables[x]+"='"+contentTablesValues[x]+contentTablesExtra[x]+"'";
			}
		}
		else
			extraTagAPP1 = " cellpadding='0' cellspacing='0' border='0' width='100%'";
			
		texten = "<table"+extraTagAPP1+">"+texten.replace(/\n<br \/>/g, "\n")+"</table>";
		
		var searchString = new RegExp ("\\[tr( rowspan=(\\d{1,2}))?\\]([\\s\\S]*?)\\[/tr\\]","gi");
		var replaceString = function($3,$2){return parseTable(2,$3,$2);};
	}
	else if (type == 2)
	{
		return "";
	}
	else
		return texten;
	
	return texten.replace(searchString, replaceString);
}

Jag hämtar texten jag vill formatera från en textarea och kör den sedan genom en regexp-replace. Här någonstans slår allt snett och det bildas en oändlig loop. Skriver jag till " return "" " i tredje sista raden (precis över "return texten.replace(searchString, replaceString);" ) så bildas det inte en oändlig loop, men om jag inte gör detta så, ja ni förstår.

Jag har försökt att hitta felet nu i flera timmar utan att lyckas. Så, om någon kunde ge mig en hjälpande hand vore jag överlycklig!

Peter SMedlem sedan dec. 20025 483 inlägg
#2

Det skulle vara lättare att debugga skriptet om du skapade ett minimalt, men komplett, exempel och bifogade.

Hur som helst har jag skapat följande:

<script>

function transform(frm){
  var ta1  = frm.elements.information,
      val1 = ta1.value,
      ta2  = frm.elements.information2,
      rslt = "";

  // replace all [/table], [/tr] and [/td]
  rslt = val1.replace(/\[\/(table|tr|td)]/gi,
			function(str, m){
			  return "</" + m + ">";
			}
		     );

  // replace [table|tr|td...]
  rslt = rslt.replace(/\[(table|tr|td)((?:\s+[^=]+=\s*\d+)*)]/gi,
			function(str, m1, m2){
			  if (!m2 && /table/i.test(m1)){ m2 = " cellpadding='0' cellspacing='0' border='0' width='100%'" }
			  return new String("<" + m1 + m2 + ">").replace(/\s*=\s*(\d+)/g, "='$1'");
			}
		     );

  ta2.value = rslt;
}

</script>

<form name="form1">
  <textarea name="information" cols="70" rows="20">[table cellspacing=100 width=90]
  [tr rowspan=4]
    [td]hej
    [/td]
    [td height = 100][/td]
  [/tr]
  [tr]
    [td]hopp[/td]
  [/tr]
[/table]
[table]
  [tr][td][/td][/tr]
[/table]
  </textarea>
  <textarea name="information2" cols="70" rows="20"></textarea>
  <br>
  <input type="button" value="transform" onclick="transform(this.form)">
</form>
131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
128 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)