1

私は次の文字列を持っています

Brad Thorm signs for the <hash>All Blacks</hash>

タグ間の「オールブラックス」ではない可能性があります。何でもかまいません。<hash></hash>タグが検出されたときに次のようにこの文字列を解析する必要があります。

  1. タグ間の文字列からすべてのスペースを削除します。つまり、「AllBlacks」は「AllBlacks」になります。
  2. タグ間の文字列の前に「#」記号を追加します。つまり、「AllBlacks」は「#AllBlacks」になります

これを行うための最もクリーンな方法を探しています。

4

2 に答える 2

3

クリスのコードを関数に作り直し、配列をループすると、これは提供された文字列内の複数のハッシュ インスタンスに対して機能します。

<cffunction name="renderHash" output="false" returnType="string">
    <cfargument name="text" required="true" type="string" hint="The text to render." />
        <cfset var strText      = arguments.text />
        <cfset var strHash      = '' />
        <cfset var arrMatches   = reMatch("<hash>(.*?)</hash>", arguments.text) />
            <cfloop array="#arrMatches#" index="i">
                <cfset strHash = reReplace(i, "<hash>(.*?)</hash>", "\1") />
                <cfset strHash = reReplace(strHash, "[[:space:]]", "", "ALL") />    
                <cfset strHash = "##" & strHash />
                <cfset strText = replace(strText, i, strHash) />
            </cfloop>
    <cfreturn strText />
</cffunction>

関数に変換する文字列を渡せば完了です。

<cfset strText = '<hash>Brad Thorm</hash> signs for the <hash>All Blacks</hash>' />
<cfset strConverted = renderHash(strText) />
于 2012-10-19T10:32:16.113 に答える
2

これを行うためのよりクリーンな方法があるかもしれませんが、これはタグ間のテキストを #hashtag に変換し、文字列内の複数のタグを処理します

<cfscript>
text = "<hash>Brad Thorm</hash> signs for the <hash>All Blacks</hash>";
matches = rematch("<hash>(.*?)</hash>", text);
for(match in matches) {
    hashtag = reReplace(match, "<hash>(.*?)</hash>", "\1");
    hashtag = reReplace(hashtag, "\W", "", "all");
    hashtag = "##" & hashtag;
    text = replace(text, match, hashtag);
}

writeoutput(text);
</cfscript>
于 2012-10-19T09:34:25.607 に答える