12

ColdFusion 文字列から HTML タグを解析する簡単な方法を探しています。RSS フィードを取り込みますが、そこには何かが含まれている可能性があります。次に、情報の操作を行ってから、別の場所に吐き出します。現在、正規表現でこれを行っています。これを行うより良い方法はありますか?

<cfloop from="1" to="#ArrayLen(myFeed.item)#" index="i">
  <cfset myFeed.item[i].description.value = 
   REReplaceNoCase(myFeed.item[i].description.value, '<(.|\n)*?>', '', 'ALL')>
</cfloop>

ColdFusion 8 を使用しています。

4

6 に答える 6

15

免責事項私は、(正規表現ではなく) 適切なパーサーを使用して HTML を解析することを強く支持します。ただし、この質問はHTML の解析に関するものではなく、HTML の破棄に関するものです。それを超えるすべてのタスクについては、パーサーを使用してください。


あなたの正規表現は良いと思います。入力からすべての HTML タグを削除する以外に何もない限り、あなたのような正規表現を使用しても安全です。

それ以外のものはおそらく価値があるよりも面倒ですが、文字列ごとに 1 回ループし、タグブラケット内にあるすべてのものを削除する小さな関数を書くことができます — 例:

  • <「 」文字に遭遇したらすぐに「inTag」フラグをオンにします。
  • >「 」に出会ったらすぐにスイッチを切る
  • フラグがオフである限り、文字を出力文字列にコピーします
  • パフォーマンスのために、文字列連結の代わりに StringBuilder Java オブジェクトを使用してください

アプリの需要の高い部分の場合、これは正規表現よりも高速になる場合があります。しかし、正規表現はきれいで、おそらく十分に高速です。

おそらく、この修正された正規表現にはいくつかの利点があります。

<[^>]*(?:>|$)
  • 文字列の末尾にある閉じられていないタグをキャッチします
  • [^>]*よりも良い(.|\n)

REReplaceNoCase()パターンに実際の文字がない場合、の使用は不要です。大文字と小文字を区別しない正規表現の一致は、大文字と小文字を区別するよりも遅くなります。

于 2009-06-09T15:43:38.640 に答える
7

HTML は正規言語ではないため、(制御されていない) HTML で正規表現を使用する場合は、細心の注意を払って行う必要があります (使用する場合)。

たとえば、次の有効なHTML セグメントについて考えてみましょう。

<img src="boat.jpg" alt="a boat" title="My boat is > everything! I <3 my boat!">

構文ハイライターがそれをどのように窒息させているかに気付くでしょう-提供されている既存の正規表現と同様に。

処理している文字列に上記のような HTML コードが含まれていないことが確実でない限り、仮定/妥協を避ける必要があります。これは、単一の/純粋な正規表現ルートが強制される可能性があります。

(注: 同じ問題が、提案されている char-by-char メソッドにも当てはまります。)


問題を解決するには、DOM パーサーを使用して文字列を HTML オブジェクトに解析し、各要素をループしてテキストに変換する必要があります。

有効な XHTML がある場合は、CF を使用XmlParse()してオブジェクトを生成し、ループすることができます。XML 以外の HTML である可能性がある場合、CF8 には組み込みオプションがないため、Java などでオプションを調査する必要があります。

于 2009-06-09T19:09:18.913 に答える
5

私はこれを使用します:

REReplaceNoCase(text, "<[^[:space:]][^>]*>", "", "ALL");

99%のケースでうまくいきます。

于 2013-12-30T11:26:10.593 に答える
2

cflibはあなたの友達です: stripHTML

于 2009-06-10T17:29:11.200 に答える
2

<最善の方法は、通常、 to&lt;>toを強制すること&gt;です。このようにして、メッセージの性質について推測することはありません。誰かが、キーストロークや数学の使用について話している<tags>、そうしようとしている、または説明している可能性があります。スマイリーでも正規表現をトリガーできます<<expressive>><Ctrl>+C1 < x > 3<8P X>

<cfloop from="1" to="#ArrayLen(myFeed.item)#" index="i">
    <cfset myFeed.item[i].description.value = ReplaceList(myFeed.item[i].description.value, '<,>', '&lt;,&gt;')>
</cfloop>
于 2009-06-09T15:46:10.637 に答える
0
<cfset a = "<b><font color = 'red'>(PCB) <1 ppm </font></b>">

<cfset b = REReplaceNoCase(a, "<[^><]*>", '', 'ALL')>

<cfdump var="#b#">

出力 b = "(PCB) <1 ppm"

正規表現 "<[^><]*>" は、すべてのタグとそれらのタグ内の文字を削除し、文字列内で小なりまたは大なり記号として使用できる < または > などの単一のタグは削除しません

于 2015-12-03T07:50:38.343 に答える