Just nu i M3-nätverket
Gå till innehåll

Ersätta tecken i en string (javascript)


Petter6

Rekommendera Poster

Hej!

 

Jag vill göra en javascript funktion som ersätter tecknet på en viss plats i en textsträng.

 

stringen kan se ut t ex så här: "hej1_1san". Det jag vill kunna göra är att genom javascriptet addera +1 till den sista ettan så att värdet ändras till "hej1_2san".

 

Det kommer alltid vara lika många tecken från slutet men variera från början, så man får väl köra en string.length och sedan säga hur många tecken från slutet den ska ersätta något.

 

Hur gör man detta?

 

 

 

[inlägget ändrat 2006-08-10 16:18:11 av knaseliknas]

[inlägget ändrat 2006-08-10 16:18:34 av knaseliknas]

Länk till kommentar
Dela på andra webbplatser

Vill du att funktionen enbart skall kunna ersätta just tecknet på positionen x platser från slutet? Eller var det där ett konkret exempel du gav och du vill att ersättningen skall fungera som en räknare, dvs. att funktionen applicerad på strängen hej1_9san skall returnera hej1_10san ?

 

Länk till kommentar
Dela på andra webbplatser

Nu måste jag lämna kontoret för den kvarvarande solen så jag slänger in ett exempel så får du spinna vidare på det så som du vill ha det:

function ReplaceText(sSource,nPosFromEnd,sReplaceChar) {
nPos=sSource.length-nPosFromEnd;
var re = new RegExp('^(.{'+nPos+'}).{1,1}(.{1,})$','i');
arrS=re.exec(sSource);
s=arrS[1]+sReplaceChar+arrS[2];
return s;
}

 

Anropa med:

sNyText=ReplaceText('hej1_1san',4,'2');

 

(vilket ersätter 4:e tecknet bakifrån med tecknet '2')

 

 

[inlägget ändrat 2006-08-10 17:15:13 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Jag tror han mer menar att lägga till 1 på det talet som finns på den sökta positionen.

 

Mitt förslag:

[log]

<html>
<head>
<title>Untitled</title>
<script type="text/javascript" language="JavaScript">
function skifta(sSource,nPosFromEnd) {
var posTecknet = sSource.lastIndexOf("_",nPosFromEnd);
var intLength = sSource.length-nPosFromEnd;
var nStrTalet = sSource.substring(posTecknet+1,intLength+1)
var firstStr = sSource.substring(0,posTecknet+1);
var lastStr = sSource.substr(intLength+1);
var NyText = firstStr+(parseInt(nStrTalet)+1)+lastStr;
return NyText;
}
</script>
</head>

<body>
<script type="text/javascript">document.write(skifta('hej1_85san',4));</script>
</body>
</html>

[/log]

[inlägget ändrat 2006-08-11 08:43:09 av Micke_skane]

Länk till kommentar
Dela på andra webbplatser

He jtack för er hjälp. Jag tror jag söker den lösningen som Micke_skane presenterar - dock funkar inte det scriptet. posTecknet får värdet -1 och firstStr får inget värde alls.

 

Det jag glömde säga i första scriptet är att det siffrar som ska plussas på med ett max ska gå till 4 och sedan börja på 1 igen.

 

Alltså:

 

Ursprungliga värdet på stringen är "hej1_1san"

 

Första klicket:

hej1_2san

 

Andra klicket:

hej1_3san

 

Tredje klicket:

hej1_4san

 

Fjärde klicket:

hej1_1san

 

 

Tacksam för er hjälp!

 

Länk till kommentar
Dela på andra webbplatser

dock funkar inte det scriptet. posTecknet får värdet -1 och firstStr får inget värde alls.

Kolla sidan/källkoden här så ser du att det fungerar:

http://user.tninet.se/~gbs951f/test/rakn_upp_ett_varde.html

 

Det jag glömde säga i första scriptet är att det siffrar som ska plussas på med ett max ska gå till 4 och sedan börja på 1 igen.

Får se om jag får tid över för att skriva något nytt.

Annars skulle jag själv gärna vilja se en RegExp-variant på det hela :)

 

Länk till kommentar
Dela på andra webbplatser

Prova detta istället:

[log]

<html>
<head>
<title>Untitled</title>
<script type="text/javascript" language="JavaScript">
var nRaknare
function skifta(sSource,nPosFromEnd) {
var posTecknet = sSource.lastIndexOf("_",nPosFromEnd);
var intLength = sSource.length-nPosFromEnd;
var nStrTalet = sSource.substring(posTecknet+1,intLength+1)
var firstStr = sSource.substring(0,posTecknet+1);
var lastStr = sSource.substr(intLength+1);
nRaknare = parseInt(nStrTalet)+1
if (nStrTalet>=4) {
nRaknare=1
}
var NyText = firstStr+(parseInt(nRaknare))+lastStr;
document.getElementById("varde").value = NyText;
}
</script>
</head>

<body>
<input type="text" id="str"> <input type="Button" onclick="skifta(document.getElementById('str').value,4);"><br />
<input type="text" id="varde">
</body>
</html>

[/log]

 

Länk till kommentar
Dela på andra webbplatser

Hårdkodad regex-variant:

[log]

function Tick(sSource) {
   var re = new RegExp('^(.{5})(.{1})(.{1,})$','i');
   arrS=re.exec(sSource);
   n=1+((parseInt(arrS[2]))%4);
   s=arrS[1]+n+arrS[3];
   return s;
}
s=Tick('hej1_1san');
alert(s);
s=Tick(s);
alert(s);
s=Tick(s);
alert(s);
s=Tick(s);
alert(s);
s=Tick(s);
alert(s);
s=Tick(s);
alert(s);

[/log]

 

Länk till kommentar
Dela på andra webbplatser

Tackar för RegExp-varianten :thumbsup:

Är egentligen rätt så "självklart" och jag har greppat att man delar in strängen i en Array men vad gör %4 i uppräkningen?

 

Länk till kommentar
Dela på andra webbplatser

men vad gör %4 i uppräkningen?

% är modulo i javascript. Det ser till att jag slipper kontrollera om värdet är 5 och då sätta det till 1.

 

Länk till kommentar
Dela på andra webbplatser

Jaha, då har man lärt sig nått nytt idag :)

Får laborera lite med det...Dock inte i kväll :)

 

Länk till kommentar
Dela på andra webbplatser

Anjua Moon - ditt exempel funkar fint! Tack!

 

Men du får ursäkta att jag är en sån sucker. :)

 

Hur gör jag om jag vill köra det från en länk alltså:

 

<a href="#" onClick="Tick('hej1_1san');">Kör javascriptet</a>

 

...och sedan att det värdet som genereras ska sättas in i en textruta:

 

<input type="text" id="output" value="">

 

 

Hur gör jag då? Tack!

 

HA en skön helg.

 

Länk till kommentar
Dela på andra webbplatser

Kommer fältet att ha något ursprungsvärde?

 

För att bara köra Ticket en gång räcker följande:

<a href="#" onClick="document.getElementById('output').value=Tick('hej1_1san');">Kör javascriptet</a>

 

 

 

Länk till kommentar
Dela på andra webbplatser

Om du vill att den ska räkna upp vid varje klick, samt om fältet är tomt visa 1-versionen av strängen får du här ett fullständigt exempel:

 

[log]

<html>
<head>
<script>
function Tick(sSource) {
   var re = new RegExp('^(.{5})(.{1})(.{1,})$','i');
   arrS=re.exec(sSource);
   n=1+((parseInt(arrS[2]))%4);
   s=arrS[1]+n+arrS[3];
   return s;
}
function TickOutput() {
   o=document.getElementById('output');
   o.value=(o.value=='')?'hej1_1san':Tick(o.value);
}
</script>

</head>

<body>
<a href="#" onClick="TickOutput();">Kör javascriptet</a>
<input type="text" id="output" value="">
</body>
</html>

[/log]

 

Länk till kommentar
Dela på andra webbplatser

Hej! Hoppas att helgen varit bra.

 

Okej nu börjar jag bli lite tjatig, men det blev klurigare än jag trodde med RegExp och hårdkodat och... trodde jag skulel reda ut det, men jag är inte så het.

 

Det verkar som koden ovan räknar från början vilket tecken som ska ändras och inte från slutet. För det funkar när jag har samma antal nokstäver i bärjan av textsträngen och jag kan ändra aantalet tecken i slutet.

 

Men hur som helst. Eftersom jag inte reder ut det... Detta ska hända (hoppas någon orkar svara):

 

Man ska klicka på en bild som kan ha varierande sökväg, t ex "/gfx/folder/bilden1_1.png", dock är det alltid 5:e tecknet från slutet som ska växla mellan 1, 2, 3, 4. Bildens id kan också variera.

Bilden ska alltså bytas ut mot en ny sökväg när man klickar på den.

 

Alltså:

<img src="/gfx/folder/bilden1_1.png" id="bildId" onClick="Change(this.src,this.id);">

 

Samtidigt ska också bildens ID skrivas till en tetxbox:

<input type="hidden" id="bildensId" value="">

 

..samt att den nya bildkällan som ändrar bilden också skrivs till en textbox:

<input type="hidden" id="bildensSource" value="">

 

Sammanfattning:

- Klicka på bilden (växlar mellan 4 olika sökvägar som kan variera och måste alltså läsas av från bilden - this.src)

- Ändrar bilden till den nya sökvägen (när den når 4 ska den börja om på 1 - alltid 5:e tecknet från slutet)

- Sätter bildens id till textbox

- Sätter bilden nya sökväg till textbox

 

 

Hoppas ni inte helt har tröttnat på mig och vill hjälpa en sista gång :) Ger såklart poäng...

 

Tack!

 

Länk till kommentar
Dela på andra webbplatser

Här är en justering av mitt script:

[log]

<html>
<head>
<script>
function Tick(sSource) {
var re = new RegExp('^(.{1,})(.{1})(.{4})$','i');
arrS=re.exec(sSource);
n=1+((parseInt(arrS[2]))%4);
s=arrS[1]+n+arrS[3];
return s;
}
function TickOutput(oImg) {
sData=oImg.src;
o=document.getElementById('output');
o.value=(o.value=='')?sData:Tick(o.value);
document.getElementById('bildensId').value=oImg.id;
document.getElementById('bildensSource').value=o.value;
}
</script>

</head>

<body>
<img src="/gfx/folder/bilden1_1.png" id="bildId" onClick="TickOutput(this);">
<input style="width:500px;" type="text" id="output" value="">
<input type="hidden" id="bildensId" value="">
<input type="hidden" id="bildensSource" value=""> 
</body>
</html>

[/log]

 

Länk till kommentar
Dela på andra webbplatser

Fungerar jättebra!

 

En finjustering man skulle kunna göra är att bilden inte ändras vid första klicket då den får samma värde som den redan har. Går det att påverka?

 

Då är det fulländat!

 

Länk till kommentar
Dela på andra webbplatser

Förstår inte vad du menar med "att bilden inte ändras". Inget i min kod ändrar i IMG-taggen.

 

Länk till kommentar
Dela på andra webbplatser

Oj! Sorry.. La till kodraden:

document.getElementById(oImg.id).src=o.value;

 

Bilden man klickar på ska alltså ändras! Tack!

 

Länk till kommentar
Dela på andra webbplatser

Ok, antar att du lade till den i TickOutput. Ändra till följande så ändras inte bildens src första gången (dvs när outputs value är tomt)

function TickOutput(oImg) {
sData=oImg.src;
o=document.getElementById('output');
blFirstTime=(o.value=='');
o.value=(blFirstTime)?sData:Tick(o.value);
document.getElementById('bildensId').value=oImg.id;
document.getElementById('bildensSource').value=o.value;
if (!blFirstTime) document.getElementById(oImg.id).src=o.value;
}

 

Länk till kommentar
Dela på andra webbplatser

Jag pratar i nattmössan. Bilden ska ändras på första klicket (vilket det inte gjorde utan den "ändrade" ju sökvägen till samma som den var alltså 1_1.png) till variant 1_2.png.

 

Tvärtom alltså. Den ska ändra bilden på första klicket!

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...