我一直在努力实现这个目标:我想在标签中将单词包装成标签和空格(可能是多个),假设原始文本可以包含不应该被修改的html标签
This is <b>very bold</b> word.
转换为 - &gt;
<w>This</w><s> </s><w>is</w><s> </s><b><w>very</w><s> </s><w>bold</w></b><s> </s><w>word</w>
实现这一目标的正确regEx是什么?
答案 0 :(得分:1)
您应该使用两个替换&gt;&gt;
s.replace(/([^\s<>]+)(?:(?=\s)|$)/g, '<w>$1</w>').replace(/(\s+)/g, '<s>$1</s>')
检查this demo。
修改强>:
对于更复杂的输入(根据下面的评论),请使用&gt;&gt;
s.replace(/([^\s<>]+)(?![^<>]*>)(?:(?=[<\s])|$)/g, '<w>$1</w>').replace(/(\s+)(?![^<>]*>)/g, '<s>$1</s>');
检查this demo。
答案 1 :(得分:0)
正则表达式不适合每项任务。如果你的字符串可以包含任意HTML,那么就不可能使用正则表达式处理所有情况,因为HTML是一种无上下文的语言,而正则表达式只包含它们的一部分。现在在搞乱循环和大量代码来处理这个问题之前,让我建议如下:
如果您在浏览器环境中或可以访问DOM库,则可以将此字符串放在临时DOM元素中,然后处理文本节点,然后再读取该字符串。
这是一个使用我写了一个月的lib并且现在更新的例子,名为Linguigi
var element = document.createElement('div');
element.innerHTML = 'This is <b>very bold</b> word.';
var ling = new Linguigi(element);
ling.eachWord(true, function(text) {
return '<w>' + text + '</w>';
});
ling.eachToken(/ +/g, true, function(text) {
return '<s>' + text + '</s>';
});
alert(element.innerHTML);
示例:http://prinzhorn.github.com/Linguigi/(点击Stackoverflow 12758422
按钮)