2012-10-19 35 views
1
之間存在

我有以下字符串ColdFusion的 - 從標籤

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

它可能不是「全黑」的標記之間,它可以是任何文字刪除空格。我需要解析此字符串,這樣當遇到了<hash></hash>標籤:

  1. 從標籤之間的字符串,即「全黑」應該成爲「AllBlacks」
  2. 添加「#」符號刪除所有空格到標籤之間的字符串的前面,即「AllBlacks」變成「#AllBlacks」

尋找最乾淨的方式來做到這一點。

回答

3

返工Chris的代碼放到一個函數和循環的陣列,這適用於多個哈希實例所提供的字符串中:

<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) /> 
+0

我確實想過把這個功能作爲一個功能,但是你得讓人們爲自己做點什麼;) –

+0

完美。謝謝。 – user460114

+0

請注意,亞光的代碼僅刪除空格,而我的原始代碼將刪除任何非單詞字符。取決於如何生成這些內容,您需要確定哪些內容適合 –

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> 
+0

謝謝克里斯,這是失敗的(火柴比賽)。我認爲這是因爲匹配是一個數組,而不是一個結構。 – user460114

+0

你沒有說你使用哪個版本的CF,在CF9 +中支持for-in循環的數組。馬特將我的代碼轉換爲基於標籤的功能應該適合您。 –