1

次のように、すべてのhtmlタグを削除するための実用的な解決策を見つけました。

<cfset test = rereplace(blah, "<h2[^>]*>", "", "ALL") />

XMLFormat()でフォーマットした後、xmlファイルを生成し、いくつかのタグの名前を変更する必要があります。したがって、私は次のことを試みました:

<!--- example string --->
<cfset blah = '&lt;h1&gt;title 1&lt;/h1&gt;
               &lt;h2 style="color: black;"&gt;title 2&lt;/h2&gt;
               &lt;h3&gt;test&lt;/h3&gt;' />

<cfset test = rereplace(blah, "&lt;h2[^>]*&gt;", "<title_2>", "ALL") />

これでタグが好きなように変更されますが、>の部分で止まりませんか?...このようにアンパサンドをエスケープしようとしました\&lt;h2[^>]*\&gt;が、役に立たないようです。

4

2 に答える 2

4

>XMLをフォーマットした後は、その文字がテキストのどこにも存在しないため、使用できません。

これは、開始h2タグと一致/置換しますが、終了タグとは一致しません。

<cfset test = blah.replaceAll('&lt;h2((?:[^&]+|&(?!gt))*)&gt;','<title_2$1>') />

その重要な部分は次のとおりです。(?:[^&]+|&(?!gt))*

gtこれは、タグの終わりが見つかるまで、アンパサンド以外の文字、またはアンパサンドの後にが続かない文字のいずれかに一致します。

タグ全体を変更するには、次のものが必要です。

<cfset test = blah.replaceAll('&lt;h2((?:[^&]+|&(?!gt))*)&gt;((?:[^&]+|&(?!lt;/h2))*)&lt;/h2&gt;','<title_2$1>$2</title_2>') />

これは、上記と同じ概念を繰り返して、コンテンツを適切なグループにキャプチャしながら、終了h2タグも探します。

この段階で、正規表現の領域に入り始めていますが、おそらくその仕事に最適なツールではありません。フォーマットする前に、XMLパーサーを使用してこれらの変更を行うことができますか?

于 2012-12-05T14:43:21.830 に答える
1
<cfset test = rereplace(blah, "&lt;h2[^>]*&gt;", "<title_2>", "ALL") /> 
<!--- there is no [^>] for you to match --->

する必要があります

<cfset test = rereplace(blah, "&lt;h2[^&]*&gt;", "<title_2>", "ALL") />

[^その部分が貪欲になるのを防いでいると思います。

于 2012-12-05T14:42:39.577 に答える