我试图用span-tags包装给定文本的单个句子,到目前为止工作得非常好。
$this.html().replace(/\b.*?[\.\?\!]/gi, "<span>$&<\/span>");
现在,在内容中已经混合了一些其他span-b标签和b-tag:
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.
由于我不想摆脱这些标签,我不想封装它们,解决方案可能是:
所以最后看起来会像这样:
<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>
这样的正则表达式会是什么样的? 我对此非常头疼,因为我的正则表达能力还很有限。
答案 0 :(得分:1)
编写解析器,而不是正则表达式。例如,使用正则表达式来处理嵌套的HTML标签将非常困难。
答案 1 :(得分:0)
我现在已经实现了一个功能,或多或少地做了我想要的功能。它基本上用占位符元素替换所有子元素(spans,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++;
});
}