4

我一直在努力实现这一点:我想将单词包装成标签和标签中的空格(可能是多个),假设原始文本可以包含不应被触及的 html 标签

This is   <b>very bold</b> word. 

转换为 -->

<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>

实现这一目标的正确正则表达式是什么?

4

2 回答 2

1

你应该使用两个替换>>

s.replace(/([^\s<>]+)(?:(?=\s)|$)/g, '<w>$1</w>').replace(/(\s+)/g, '<s>$1</s>')

检查这个演示


编辑

对于更复杂的输入(基于您在下面的评论),请使用 >>

s.replace(/([^\s<>]+)(?![^<>]*>)(?:(?=[<\s])|$)/g, '<w>$1</w>').replace(/(\s+)(?![^<>]*>)/g, '<s>$1</s>');

检查这个演示

于 2012-10-06T13:25:25.623 回答
0

正则表达式并不适合所有任务。如果您的字符串可以包含任意 HTML,则无法使用正则表达式处理所有情况,因为 HTML 是一种上下文无关的语言,而正则表达式仅涵盖其中的一部分。现在在搞乱循环和大量代码来处理这个问题之前,让我提出以下建议:

如果您在浏览器环境中或可以访问 DOM 库,则可以将此字符串放在临时 DOM 元素中,然后处理文本节点,然后再读回字符串。

这是一个使用我一个月编写并现在更新的库的示例,称为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按钮)

于 2012-10-06T09:55:15.800 回答