Вы можете попробовать это, но вам, возможно, придется проверить параметр a, если вы хотите сделать специальную обработку для своего слова, уже содержащегося в html-теге:
var str = "Bonjour, je m'appelle Francis et je suis le plus bel homme du monde";
var regex = /\S+/g;
var id = 0;
var result = str.replace(regex, function(a) {
return "<span id=" + (++id) + ">" + a + "</span>";
});
alert(result);
live demo: http://jsfiddle.net/NtNtj/
РЕДАКТИРОВАТЬ: Если вы не хотите перезаписывать существующий идентификатор, вы можете попробовать это
var str = "Bonjour, je m'appelle <b>Francis</b> et <span id=\"existing\">je</span> suis le plus bel homme du monde";
var regex = /(<.+?<\/.+?>|\S+)/g;
var id = 0;
var result = str.replace(regex, function(a) {
var m = (/<(\w+)([^>]*)>([^<]*)<\/\w+>/).exec(a);
if (m !== null && m[1] === "span" && m[2].test(/id=/))
return a;
return "<span id=" + (++id) + ">" + a + "</span>";
});
console.log(result);
http://jsfiddle.net/NtNtj/8/
РЕДАКТИРОВАТЬ: если вы можете иметь несколько слов в тегеНапример, если вы хотите обернуть каждое слово между ними, вы можете рекурсивно вызвать функцию замены со значением внутри тега следующим образом:
var str = "Bonjour, <b>je m'appelle Francis</b> et <span id=\"existing\">je</span> suis le plus bel homme du monde";
var regex = /(<.+?<\/.+?>|\S+)/g;
var id = 0;
var result = str.replace(regex, function(a) {
var m = (/<(\w+)([^>]*)>([^<]*)<\/\w+>/).exec(a);
if (m !== null && m[1] === "span" && m[2].test(/id=/))
return a;
if (m !== null)
return "<" + m[1] + m[2] + ">" + m[3].replace(regex, arguments.callee) + "</" + m[1] + ">";
return "<span id=" + (++id) + ">" + a + "</span>";
});
console.log(result);
live demo: http://jsfiddle.net/francisfortier/NtNtj/9/