0

すべての href 値内のテキストを置き換える必要があります。正規表現がそれを行う方法だと思いますが、私は正規表現のプロではありません。ColdFusion を使用して次のことを行う方法について何か考えはありますか?

<a href="http://www.replace-this-link.com"></a>

したがって、次のように変更されます。

<a href="{replaced}"></a>

ありがとう!

質問の更新は次のとおりです。このコードがあり、以下のパターンが必要です。

<cfset matches = ReMatch('<a[^>]*href="http[^"]*"[^>]*>(.+?)</a>', arguments.htmlCode) /> <cfdump var="#matches#">
<cfset links = arrayNew(1)>
<cfloop index="a" array="#matches#">
<cfset arrayAppend(links, rereplace(a, 'need regex'," {clickurl}","all"))>
</cfloop>
<cfdump var="#links#">
4

1 に答える 1

1

jSoup HTMLパーサーでそれを行う方法は次のとおりです。

<cfset jsoup = createObject('java','org.jsoup.Jsoup') />

<cfset Dom = jsoup.parse( InputHtml ) />

<cfset Dom.select('a[href]').attr('href','{replaced}') />

<cfset NewHtml = Dom.html() />

(CF9 以前では、jsoup の jar を CF の lib ディレクトリに配置するか、 JavaLoader を使用する必要があります。)

通常、HTML パーサーを使用する方が正規表現を使用するよりも優れています。

正規表現でそれを行う不完全な方法は次のとおりです。

<cfset NewHtml = InputHtml.replaceAll
    ( '(?<=<a.{0,99}?\shref\s{0,99}?=\s{0,99}?)(?:"[^"]+|''[^'']+)(["'])'
    , '$1{replaced}$1'
    )/>

jsoupなどのツールを使用することが間違いなく正しい方法である理由をうまく説明できれば幸いです...

(ところで、上記は Java 正規表現エンジンを ( string.replaceAll経由で) 使用しているため、CF の組み込み正規表現 (rereplace/rematch/etc) には存在しない後読み機能を使用できます)


あなたが提供した新しいコードサンプルに基づいて更新します...

以下は、jsoup を使用して実行する方法の例です。({clickurl} が最終的に何を行うかによって) いくつかの更新が必要になる場合がありますが、現在、サンプル コードが試みているのと同じように機能します。

<cfset jsoup = createObject('java','org.jsoup.Jsoup') />

<cfset links = jsoup.parse( Arguments.HtmlCode )

    <!--- select all links beginning http and change their href --->
    .select('a[href^=http]').attr('href',' {clickurl}')

    <!--- get HTML for all links, then split into array. --->
    .outerHtml().split('(?<=</a>)(?!$)')
    />

<cfdump var=#links# />

その中間部分はすべて 1 つの cfset ですが、わかりやすくするために分割してコメントを追加しました。(もちろん、必要に応じて複数の変数と 3 つ以上の cfsets を使用してこれを行うこともできます。)

繰り返しますが、これは正規表現ではありません。なぜなら、あなたがしていることには HTML の解析が含まれており、正規表現はタグベースの構文を解析するようには設計されていないため、あまり得意ではありません - HTML には多くの癖やバリエーションがあり、それらを説明しています単一の正規表現では、すぐに非常に複雑になります。

于 2012-08-24T16:37:07.160 に答える