2009-07-21 34 views
5
私はそれが例えば、HTMLタグ内にある場合、それをJavaScriptを使用してHTMLページ内の文字列を置き換えますが無視したい

:私はでgoogleを交換したい正規表現文字列を置換ではなく、内部のHTMLタグ

<a href="google.com">visit google search engine</a> 
you can search on google tatatata... 

<b>google</b>ではなく、ここに:

<a href="google.com">visit google search engine</a> 
you can search on <b>google</b> tatatata... 

私はこの1つを試してみました:

regex = new RegExp(">([^<]*)?(google)([^>]*)?<", 'i'); 
el.innerHTML = el.innerHTML.replace(regex,'>$1<b>$2</b>$3<'); 

しかし、問題は、この問題を解決するにはどうすればよい

<a href="google.com">visit <b>google</b> search engine</a> 
you can search on <b>google</b> tatatata... 

:私は<a>タグ内<b>google</b>を得ましたか。

答えて

6

正規表現ではなく、htmlパーサーを使用する方がよいでしょう。私はそれが100%確実に実行できるかどうかはわかりません。

1

あなたが本当にあなたの「Googleの」いくつかのタグに常にある、ことを行い、いずれかのすべてまたはnoneあなたがよく、または正規表現としてやることができない場合があり

5

を置き換えることはできません。条件をどれだけ正確に定義できるかによって異なります。置き換えられた文字列がHTMLタグ内にある場合を除いて、ページ上のすべてがおそらく何らかのHTMLタグ内にあるため(おそらく何もない場合はBODY)、狭い幅ではないとします。

HTMLの正規表現を使用する代わりに、DOMツリーをトラバースする方が効果的です。

+1

私は同意します。文字列を含むDOM内のすべてのテキストノードを検索します。文字列を置換したくない**タグのブラックリストを保持します。テキストノードがこれらのタグのいずれかに入っているかどうかを確認します。そうでない場合は、交換品を交換し、そうでない場合はそのままにしておきます。 – tvanfosson

1

正規表現でのHTMLの解析は、のHTMLが通常のではないため、簡単な場合以外は簡単にはできません。

詳細については、this Stackoverflow question(および回答)を参照してください。

0

まあ、すべてがタグの一部なので、あなたの要求は本当の意味がありません。 <a />タグの場合は、その部分をチェックするだけでよいでしょう。主に彼がタグ内に言うとき、彼は開口部の内側を意味します...

をあなたは私はあなたがすべてここに質問を欠けていると思う新鮮<a>

1

前にテーリング</a>タグを持っていないことを確認することにより、タグ、< HREFのように= "google.com" >タグ...これは<P> </P >タグのペアまたは<体> < /ボディ>内のテキスト、と言うよりもかなり違う何かが、あります。私はまだ答えはありませんが、私はこの同じ問題に苦しんでおり、正規表現を使って解く必要があることを知っています。私がそれを見つけたら、私は戻ってきて掲示します。

1

回避策

あなたはこの試みるHTMLパーサーを使用するか、あなたのHTML構造についてはかなり自信を持っていることができない場合は、「悪い」は置き換え

  • 繰り返しを変えない

    1. を(< [^>] *)(< [^>] +>)を$ 1に数回(必要な分だけ)

    簡単な回避策は、私のために働く。

    短所 SOLUTION

    : うーん...あなたはそれがページ

    上のすべてのタグからのみ最初の不要なタグを削除すると... ...>ケースのために二回交換してください[編集]をしなければなりません

    はjQueryのを使用しないのはなぜ、ページにHTMLコードを入れて、このような何かを:

    $(containerOrSth).find('a').each(function(){ 
    if($(this).children().length==0){ 
    $(this).text($(this).text().replace('google','evil')); 
    }else{ 
    //here You have to care about children tags, but You have to know where to expect them - before or after text. comment for more help 
    } 
    }); 
    
  • +0

    もう1つは、パーサーではないということです。 – BalusC

    +1

    ねえ、私は "あなたがパーサを使うことができないのなら"と言った - そう、そうではない – naugtur

    0

    あなたはSTYLE、SCRIPTやCDATAなどのREGEXが、フィルタリング・ブロックを使用すると、より多くの作業が必要になりますことを行うには、実装することはできません次の解決策に記載されています。

    ほとんどの回答では、「あなたのデータは常にいくつかのタグにありますが、ポイントがありません。データは常にいくつかのタグの間にあり、タグ内のどこにフィルタをかけたいのですか?

    インラインスクリプトのタグ文字はこれを破る可能性が高いので、存在する場合は、この方法で別々に処理する必要があります。ここをクリックしてください:
    complex html string.replace function

    関連する問題