474

I'm trying to use this code to replace spaces with _, it works for the first space in the string but all the other instances of spaces remain unchanged. Anybody know why?

function updateKey()
{
    var key=$("#title").val();
    key=key.replace(" ","_");
    $("#url_key").val(key);
}

11 Answers 11

915

Try .replace(/ /g,"_");

Edit: or .split(' ').join('_') if you have an aversion to REs

Edit: John Resig said:

If you're searching and replacing through a string with a static search and a static replace it's faster to perform the action with .split("match").join("replace") - which seems counter-intuitive but it manages to work that way in most modern browsers. (There are changes going in place to grossly improve the performance of .replace(/match/g, "replace") in the next version of Firefox - so the previous statement won't be the case for long.)

Sign up to request clarification or add additional context in comments.

11 Comments

Is there any way to do this without the regexp?
Reason why the people who answered did not use /\s/g ?
Instead of / /g use /\ /g - both work in Javascript. The latter works in CoffeeScript also.
As of 2015 is .replace(/ /g,"_"); faster than .split(' ').join('_').
Future people browsing this @Inez has a link to test both speeds of split/join VS. replace. As of late 2018 replace is significantly faster.
|
99

try this:

key=key.replace(/ /g,"_");

that'll do a global find/replace

javascript replace

1 Comment

Beautiful code!!! That did it!!!
75

To answer Prasanna's question below:

How do you replace multiple spaces by single space in Javascript ?

You would use the same function replace with a different regular expression. The expression for whitespace is \s and the expression for "1 or more times" is + the plus sign, so you'd just replace Adam's answer with the following:

key=key.replace(/\s+/g,"_");

Comments

58

You can try this

 var str = 'hello     world  !!';
 str = str.replace(/\s+/g, '-');

It will even replace multiple spaces with single '-'.

1 Comment

Probably noteworthy: This does also strip tabs other whitespace.
22

Replace spaces with underscore

var str = 'How are you';
var replaced = str.split(' ').join('_');

Output: How_are_you

Comments

19

I created JS performance test for it http://jsperf.com/split-and-join-vs-replace2

3 Comments

it seems nowadays replace is the better overall choice
Kave - what? Although not all browsers are equal, split/join on average is much better. In fact, in a lot of modern browsers, it's a tone better! Thanks Inez for setting this up!
A little over a year later now and running that above test in Chrome 32.0.1700.107 .. str.replace() yields far better results (64% faster)
10

Replace all occurrences

This is happening because replace() method is designed this way to replace only the first occurance when you use string to find the match. Check the replace method.

To replace all matches you can use the following 3 methods:

  1. use regex with the global flag in replace() method:

    When you use the replace method with regex with /g flag it replaces all the matching occurrences in a string.

        function updateKey()
        {
            var key=$("#title").val();
            key=key.replace(/ /g,"_");
            $("#url_key").val(key);
        }
        // Show case
        let title = "Your document title";
        console.log(title.replace(/ /g,"_"));

  2. Using replaceAll method:

    The replaceAll method will remove all spaces with an underscore. (must use the global flag with it when using regex)

        function updateKey()
        {
            var key=$("#title").val();
            key=key.replaceAll(/ /g,"_");
            // key=key.replaceAll(" ","_"); also valid
            $("#url_key").val(key);
        }
        // Show case
        let title = "Your document title";
        console.log(title.replaceAll(/ /g,"_"));

  3. Use a combination of split and join method:

    Split your string at spaces and join it by using _ as a separator in the join method.

        function updateKey()
        {
            var key=$("#title").val();
            key=key.split(" ").join("_");
            $("#url_key").val(key);
        }
        // Show case
        let title = "Your document title";
        console.log(title.split(" ").join("_"));

Comments

4

Just using replace:

var text = 'Hello World';
    
new_text = text.replaceAll(' ', '_');
    
console.log(new_text);

3 Comments

This will just replace the first space not after that
This answer should be removed as the OP tried that and it failed.
With replaceAll this does work. (Method is only not supported in IE.)
3

I know this is old but I didn't see anyone mention extending the String prototype.

String.prototype.replaceAll = function(search, replace){
    if(!search || !replace){return this;} //if search entry or replace entry empty return the string
    return this.replace(new RegExp('[' + search + ']', 'g'), replace); //global RegEx search for all instances ("g") of your search entry and replace them all.
};

1 Comment

You didn't see anyone do it as it's a terrible idea. Check out this other SO question for more.
1

const updateKey = key => console.log(key.split(' ').join('_'));
updateKey('Hello World');

Comments

0
$(function() {
    $('#title').keyup(function() {
        var value = $(this).val().toLowerCase();
        $('#url_key').val(value.split(' ').join('_'));
    }).keyup();
});

-- or you can use:

$(function() {
    $('#title').keyup(function() {
        var value = $(this).val().toLowerCase();
        $('#url_key').val(value.replace(/ /g,"_"));
    }).keyup();
});

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.