正则表达式匹配段落中的单词但排除内部HTML标记

Sir*_*att 0 html javascript regex jquery

我正在使用我在stackoverflow上找到的正则表达式来环绕带有span标记的段落中的单词实例,以便用户可以单击每个内部单词以查看该单词的定义.这完全有效,但是,我遇到的问题是,有时段落中包含内容或标签的单词短语,例如标题.

作品:

<div id="passage"> 
<p>
    Hello, my name is SirTophamHatt.
</p>
...
</div>

$('#passage').find('p').each(function() {
    $(this).html(function (index, oldHtml) {
        return oldHtml.replace(/\b(\w+?)\b/g, '<span class="word">$1</span>');
    });
});

<div id="passage">
<p>
    <span class="word">Hello</span>, <span class="word">my</span> <span class="word">name</span> <span class="word">is</span> <span class="word">SirTophamHatt</span>.
</p>
...
</div>
Run Code Online (Sandbox Code Playgroud)

不起作用:

<div id="passage"> 
<p>
    <em>Hello, my name is SirTophamHatt.</em>
</p>
...
</div>

$('#passage').find('p').each(function() {
    $(this).html(function (index, oldHtml) {
        return oldHtml.replace(/\b(\w+?)\b/g, '<span class="word">$1</span>');
    });
});

<div id="passage">
<p>
    <
    <span class="word">em</span>
    >
    <span class="word">Hello</span>, 
    <span class="word">my</span> 
    <span class="word">name</span> 
    <span class="word">is</span> 
    <span class="word">SirTophamHatt</span>
    <!--<span class="word">-->em>
</p>
...
</div>
Run Code Online (Sandbox Code Playgroud)

为清楚起见,我将最后一段分开.

我对正则表达式不太满意; 如何修改模式,使其匹配所有未启动或关闭HTML标记的单词?

谢谢!

编辑:子元素中的单词必须包围它.必须忽略HTML标记本身.

EDIT2:匆忙的例子,没有提供正确的字符串替换使用.

Jer*_*rry 8

您可以使用负前瞻来确保在没有开口角度支架的情况下,没有关闭的角度支架:

\b(\w+(?![^<>]*>))\b
      ^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

我认为你可以安全地删除?in \w+?,因为你匹配整个单词.