1

我有以下字符串

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

标签之间可能不是“全黑”,它可能是任何东西。我需要解析这个字符串,以便在<hash></hash>遇到标签时:

  1. 从标签之间的字符串中删除所有空格,即“All Blacks”应变为“AllBlacks”
  2. 在标签之间的字符串前面添加一个“#”符号,即“AllBlacks”变为“#AllBlacks”

寻找最干净的方法来做到这一点。

4

2 回答 2

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) />
于 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 回答