0

我们使用这个脚本来改变句子中的最后一个单词。

$div = $('.cPageHeader h2');
$div.html($div.text().replace(/(\w+?)$/, '<span class="cOrange">$1</span>'));

只要不涉及特殊字符,这就会很好地工作。

只要我们有一个像<h2>International fancy stüff</h2>突出显示这样的标题就会出错。只有 ff 会突出显示。如果我们在行尾有一个字符,则会发生同样的错误(!-.?)

有人可以更改脚本,以便突出显示最后一个完整的单词(包括附加的标点符号)并且不管任何重音字符吗?

4

2 回答 2

2

我建议:

$div = $('.cPageHeader h2');
$div.html($div.text().replace(/(\S+?)$/, '<span class="cOrange">$1</span>'));

JS 小提琴演示

这基本上会在字符串末尾查找所有非空白字符,尽管如果您的字符串以空白结尾,则不会有突出显示(因此可能值得修剪字符串,以确保。

以下复制了上述内容,但对尾随空格更宽容:

var $div = $('#demo');
$div.html($div.text().replace(/\b(\S+?)(\b|(?:\s+))$/, '<span class="cOrange">$1</span>'));

JS 小提琴演示

这匹配:

  • \b: 词界;
  • \S+: 一个或多个非空白字符的序列;
  • (\b|(?:\s+)):另一个字边界一个或多个空白字符的序列。

再次更新,因为$1原始表达式中的编号匹配项(the )显然已被弃用,或者很快就会被弃用(尽管我找不到支持该特定回忆的参考,所以也许可以加点盐),并且改为使用函数:

var $div = $('#demo');
$div.html($div.text().replace(/\b(\S+?)(\b|(?:\s+))$/, function(a){
    return '<span class="cOrange">' + a + '</span>';
}));

JS 小提琴演示

参考:

于 2013-06-12T15:20:47.787 回答
1

这应该是您所需要的:

$div.text().replace(/(\S+)$/, '<span class="cOrange">$1</span>')

无论如何,您都希望在匹配中包含尾随标点符号,因此\w+从来都不是适合这项工作的工具。这样您就不必处理使其将非 ASCII 字符ü视为单词字符的问题。

仅供参考,使用不情愿的量词是没有意义的\S+?,因为你一直匹配到字符串的末尾。在这种情况下,这不是不正确的,只是毫无意义。

于 2013-06-12T16:07:33.657 回答