0

特定のテキストの単一の文をスパンタグでラップしようとしていますが、これはこれまでのところかなりうまく機能しています。

$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++;
 });
}

jsフィドル

于 2013-01-04T09:40:32.650 に答える