0

我正在尝试用 span-tags 包装给定文本的单个句子,到目前为止效果很好。

$this.html().replace(/\b.*?[\.\?\!]/gi, "<span>$&<\/span>");

现在,内容中已经混合了一些其他的跨度和 b-标签,如下所示:

Gumbo groundnut daikon radicchio scallion lettuce rock melon peanut. <span class="yellow">Catsear swiss chard epazote bush tomato peanut chicory amaranth tomato gourd.</span> Earthnut pea brussels sprout gumbo celery tomato salad kale. Spinach scallion tomatillo bitterleaf lentil <b>green</b> bean celery amaranth onion catsear sweet pepper fava bean silver beet spinach.

由于我不想摆脱这些标签,也不想封装它们,因此解决方案可能是:

  1. 只是忽略标签和里面的东西
  2. 将标签视为句子的结尾和开头

所以最后它看起来像这样:

<span>Gumbo groundnut daikon radicchio scallion lettuce rock melon peanut. <span class="yellow">Catsear swiss chard epazote bush tomato peanut chicory amaranth tomato gourd.</span> <span>Earthnut pea brussels sprout gumbo celery tomato salad kale.</span> <span>Spinach scallion tomatillo bitterleaf lentil </span><b>green</b><span> bean celery amaranth onion catsear sweet pepper fava bean silver beet spinach.</span>

这样的正则表达式会是什么样子?我对此感到非常头疼,因为我的正则表达式技能还很有限。

4

2 回答 2

1

编写解析器,而不是正则表达式。例如,仅使用正则表达式处理嵌套的 HTML 标记将非常困难。

于 2013-01-02T17:53:24.533 回答
0

我现在已经实现了一个小功能,它或多或少地完成了我想要的。它基本上用占位符元素替换所有子项(跨度、bs 等),因此它们不会与正则表达式混淆。后来我只是用原始的子元素替换占位符。这是一种快速而肮脏的解决方案,但目前它运行良好。

function wrapSentences($element){
var j = 0, i = 0, placeholders = [];

 $.each($element.children(),function(){
     var p = $("<b id='p"+j+"'></b>");
     $(this).after(p).remove();
       placeholders.push($(this));
    j++;                              
 });

 $element.html($element.html().replace(/\(?[A-Z][^\.]+[\.!\?]\)?/g, "<span class='s'>$&<\/span>"));


 $.each(placeholders,function(){
       $element.find("#p"+i).replaceWith(this);
      i++;
 });
}

jsFiddle

于 2013-01-04T09:40:32.650 回答